Продолжение — Множественные суммы в SQL-запросе

#sql #sql-server

#sql #sql-server

Вопрос:

Спасибо Quassnoi, который ранее дал мне ответ, который я искал — это привело к отдельной проблеме. Текущий код:

 SELECT     i.CONCOM, COALESCE (SUM(t.LOGMINS), 0) AS TotalWithoutNew
FROM         INQUIRY AS i INNER JOIN
                  TIMELOG AS t ON t.INQUIRY_ID = i.INQUIRY_ID INNER JOIN
                  PROD AS P ON i.PROD_ID = P.PROD_ID INNER JOIN
                  CATEGORY AS C ON P.CATEGORY_ID = C.CATEGORY_ID
WHERE     (DATEPART(month, i.ESCDATE) = DATEPART(month, GETDATE()) - 1) AND (DATEPART(year,   i.ESCDATE) = DATEPART(year, DATEADD(m, - 1, GETDATE()))) AND 
                  (C.CATEGORY_ID <> '30')
GROUP BY i.CONCOM
ORDER BY TotalWithoutNew DESC
  

Это возвращает именно то, что я хочу (C.CATEGORY_ID <> 30) не включен в начальный столбец, помеченный как TotalWithoutNew. Мне также нужно значение С ним, хотя. Есть ли какой-либо способ создать другой столбец с именем TotalWithNew, который включает все идентификаторы CATEGORY_IDs? Я уверен, что сегодня изучаю много нового языка запросов!

Ответ №1:

 SELECT     i.CONCOM, 
COALESCE (SUM(CASE WHEN C.CATEGORY_ID = '30' THEN 0 ELSE t.LOGMINS END), 0) AS TotalAllID,
COALESCE (SUM(t.LOGMINS), 0) AS TotalWithoutNew
FROM         INQUIRY AS i INNER JOIN
                  TIMELOG AS t ON t.INQUIRY_ID = i.INQUIRY_ID INNER JOIN
                  PROD AS P ON i.PROD_ID = P.PROD_ID INNER JOIN
                  CATEGORY AS C ON P.CATEGORY_ID = C.CATEGORY_ID
WHERE     (DATEPART(month, i.ESCDATE) = DATEPART(month, GETDATE()) - 1) AND (DATEPART(year,   i.ESCDATE) = DATEPART(year, DATEADD(m, - 1, GETDATE()))) 
GROUP BY i.CONCOM
ORDER BY TotalWithoutNew DESC
  

Примечание: Я не пробовал, но надеюсь, вы поняли идею использования CASE WHEN ... .

Комментарии:

1. Хитрость заключается в использовании CASE WHEN THEN для преобразования значений в 0, если они находятся в CategoryID 30. (Я думаю, что обычно лучше объяснять вещи, а не скрывать это в коде.)

2. Это отлично сработало, и спасибо за пояснительные демки, которые мне были интересны! 🙂

Ответ №2:

 SELECT i.CONCOM
    , COALESCE(SUM(CASE WHEN C.CATEGORY_ID <> 30 THEN t.LOGMINS END), 0)
         AS TotalWithoutNew
    , COALESCE(SUM(t.LOGMINS), 0) AS TotalWithNew
FROM INQUIRY AS i INNER JOIN
    TIMELOG AS t ON t.INQUIRY_ID = i.INQUIRY_ID INNER JOIN
    PROD AS P ON i.PROD_ID = P.PROD_ID INNER JOIN
    CATEGORY AS C ON P.CATEGORY_ID = C.CATEGORY_ID
WHERE (DATEPART(month, i.ESCDATE) = DATEPART(month, GETDATE()) - 1)
AND (DATEPART(year,   i.ESCDATE) = DATEPART(year, DATEADD(m, - 1, GETDATE())))
GROUP BY i.CONCOM
ORDER BY TotalWithoutNew DESC