#sql-server-2005
#sql-server-2005
Вопрос:
Я использую приведенный ниже запрос для подсчета конкретных данных столбца на основе одного условия.
SELECT COUNT(DISTINCT(S.INVOICENO)) AS LESSTWO , YEAR(S.invoicedate) YER,
Month(S.invoicedate) MNTH
FROM SALESDATA S
where S.BILLINGTYPE='INVOICE'
AND (S.invoicedate >='4-1-2009' and S.invoicedate <='4-30-2010')
AND S.TAXABLEAMT <=2000
GROUP BY YEAR(S.invoicedate) ,Month(S.invoicedate)
ORDER BY YEAR(S.invoicedate) ,Month(S.invoicedate)
Но я должен вычислить еще для 3 условий. Возможно ли подсчитать на основе 3 условий (т.Е. 2001 — 3000,3001 — 4000, 4001 — 5000,>5000) и я хочу, чтобы результат был установлен для всех условий?
С уважением,
Н.ШРИРАМ
Ответ №1:
Непроверено, но должно быть примерно так:
SELECT CASE
WHEN S.TaxableAmt <= 2000 THEN '<=2000'
WHEN S.TaxableAmt <= 3000 THEN '2001-3000'
WHEN S.TaxableAmt <= 4000 THEN '3001-4000'
ELSE '>5000'
END as Bracket,
COUNT(DISTINCT(S.INVOICENO)) AS LESSTWO , YEAR(S.invoicedate) YER,
Month(S.invoicedate) MNTH
FROM SALESDATA S
where S.BILLINGTYPE='INVOICE'
AND (S.invoicedate >='20090401' and S.invoicedate <='20100430')
GROUP BY
CASE
WHEN S.TaxableAmt <= 2000 THEN '<=2000'
WHEN S.TaxableAmt <= 3000 THEN '2001-3000'
WHEN S.TaxableAmt <= 4000 THEN '3001-4000'
ELSE '>5000'
END,
YEAR(S.invoicedate) ,Month(S.invoicedate)
ORDER BY YEAR(S.invoicedate) ,Month(S.invoicedate)
Вам нужно повторить выражение case в GROUP BY
предложении (или поместить все это в подзапрос), и я исправил ваши константы даты, чтобы они были однозначными.
Комментарии:
1. Спасибо, сэр. Я изменил ваш запрос, как показано ниже.
Ответ №2:
Я думаю, вам действительно нужно разделить запрос на 3 отдельных запроса — по одному для каждого из требуемых вами условий