Есть ли способ объединить эти два запроса в один запрос - всего один поход к базе данных?
Оба запроса обращаются к одной и той же таблице, но первый ищет Total Active Circuits, а второй ищет Total Circuits.
Я надеюсь показать такие результаты... 15/4, 34/12, 21/2 (где первое число — ActiveCircuits, а второе — TotalCircuits)
SELECT COUNT(CircuitID) AS ActiveCircuits
FROM Circuit
WHERE StateID = 5
AND Active = 1
SELECT COUNT(CircuitID) AS TotalCircuits
FROM Circuit
WHERE StateID = 5
Используйте условную агрегацию:
SELECT COUNT(*) AS TotalCircuits,
SUM(CASE WHEN Active = 1 THEN 1 ELSE 0 END) as ActiveCircuits
FROM Circuit
WHERE StateID = 5;
Это предполагает, что CircuitId
никогда не бывает NULL
, что кажется вполне разумным в таблице под названием Circuit
.
Любопытно, почему вы использовали SUM ... ELSE 0
, другие варианты: отбросить ELSE
и переключиться на COUNT
. Я всегда использовал COUNT
без ELSE
, есть ли причина предпочесть одно другому?
@Чарлифейс. . . Я думаю, что SUM(1)
намного понятнее, чем COUNT()
. Проблема в том, что COUNT(1) =
COUNT(2)` кажется нелогичным.
Вы можете использовать случай, когда нужно иметь 1
везде, где он активен, а затем взять сумму, чтобы получить общее количество 1 или активных цепей.
SELECT COUNT(CIRCUITID) AS TOTALCIRCUITS,
SUM(CASE WHEN ACTIVE = 1 THEN 1 ELSE 0 END) AS ACTIVECIRCUITS
FROM CIRCUIT
WHERE STATEID = 5
Каковы возможные значения для
Active
? Если это просто0
или1
, тоSum( Active )
поможет. Рекомендуем к прочтению.