2013-08-12 2 views
1

У меня есть 4 запроса, которые идентичны, за исключением одного из предложений критериев в конце. Я пытаюсь найти способ сконденсировать эти 4 в 1, если это возможно. В настоящее время программа, которую мы написали, вызывает эти 4 заявления через 4 хранимые процедуры, но если я могу сделать этот 1 вызов, который возвращает все 4, это было бы здорово. Вот основная часть заявления:Присоединение нескольких запросов с различными критериями поиска

SELECT SUM(PausedTime) AS PausedMode 
FROM UsageStats 
WHERE StartDate >= CONVERT(VARCHAR(8), @StartDate, 112) AND StopDate < CONVERT(VARCHAR(8), @EndDate, 112) 
AND LocationID = @LocationID 
AND SystemID = @SystemID 
AND PlayingArea = @PlayingArea 
AND PausedTime > 0 

У меня есть несколько из них 3, и единственное, что меняется это поле в вычислении SUM (все поля SUM имеют тип int):

SUM(PlayModeTime) AS PlayModeTime 
SUM(RecordModeTime) AS RecordModeTime 
SUM(ReplayModeTime) AS ReplayModeTime 

и последние AND критерии и PlayModeTime> 0 и RecordModeTime> 0 и ReplayModeTime> 0

Я попытался с помощью CASE сек tatement в выбранном пункте, но это не удалось:

SELECT 
    playMode = (CASE WHEN PlayModeTime > 0 THEN SUM(PlayModeTime) END), 
    pausedMode = (CASE WHEN PausedTime > 0 THEN SUM(PausedTime) END), 
    recordMode = (CASE WHEN RecordModeTime > 0 THEN SUM(RecordModeTime) END), 
    replayMode = (CASE WHEN ReplayModeTime > 0 THEN SUM(ReplayModeTime) END) 
FROM UsageStats 
WHERE StartDate >= CONVERT(VARCHAR(8), @StartDate, 112) AND StopDate < CONVERT(VARCHAR(8), @EndDate, 112) 
AND LocationID = @LocationID 
AND SystemID = @SystemID 
AND PlayingArea = @PlayingArea 
GROUP BY PlayModeTime, PausedTime, RecordModeTime, ReplayModeTime 

Я хотел бы получить что-то вроде этого:

PlayModeTime | PausedMode | RecordModeTime | ReplayModeTime 
--------------------------------------------------------------- 
200    340   10    55 

Любая помощь приветствуется.

ответ

2

Я не понимаю, зачем вам эти условия вообще, поскольку SUM добавит ноль, когда значение равно 0. Можете вы просто не SUM всех столбцы ?:

SELECT 
    playMode = SUM(PlayModeTime), 
    pausedMode = SUM(PausedTime), 
    recordMode = SUM(RecordModeTime), 
    replayMode = SUM(ReplayModeTime) 
FROM UsageStats 
WHERE StartDate >= CONVERT(VARCHAR(8), @StartDate, 112) 
AND StopDate < CONVERT(VARCHAR(8), @EndDate, 112) 
AND LocationID = @LocationID 
AND SystemID = @SystemID 
AND PlayingArea = @PlayingArea 
0

Вы должны переместить сумму вне саза:

SELECT 
    playMode = SUM(CASE WHEN PlayModeTime > 0 THEN PlayModeTime ELSE 0 END), 
    pausedMode = SUM(CASE WHEN PausedTime > 0 THEN PausedTime ELSE 0 END), 
    recordMode = SUM(CASE WHEN RecordModeTime > 0 THEN RecordModeTime ELSE 0 END), 
    replayMode = SUM(CASE WHEN ReplayModeTime > 0 THEN ReplayModeTime ELSE 0 END) 
FROM UsageStats 
WHERE StartDate >= CONVERT(VARCHAR(8), @StartDate, 112) AND StopDate < CONVERT(VARCHAR(8), @EndDate, 112) 
AND LocationID = @LocationID 
AND SystemID = @SystemID 
AND PlayingArea = @PlayingArea 
GROUP BY PlayModeTime, PausedTime, RecordModeTime, ReplayModeTime 

Причины в том, что дело будет оцениваться для каждой строки , В вашем примере вы берете сумму столбца, но только для этой строки.

Это только отличается от ответа Lamak тем, что он будет обрабатывать отрицательные значения как нули в сумме.

Смежные вопросы