Упорядочить результаты в SQL - PullRequest
2 голосов
/ 25 января 2012

У меня работает следующий запрос:

SELECT
COUNT(id), AgeRange
FROM
(
select
id,
case
when age < 0 then 'less than 0'
when age >= 0 and age <=30 then '0-30'
when age >= 31 and age <=60 then '31-60'
when age >= 61 and age <=90 then '61-90'
when age >= 91 then '91+'
when age = null then 'NO INFORMATION'
else 'no catagory'
end AS AgeRange
from queue 
where DATE between '01-Apr-2011' and '05-May-2011'
) T
GROUP BY
AgeRange;

Теперь мое требование состоит в том, чтобы я хотел, чтобы эти результаты печатались всегда в последовательности, сначала для менее 0, чем для 31-60 и так далее.

Даже если получить счет 0 для любого интервала, скажем, 31-60. Он должен вернуть 0 для этого интервала. Может кто-нибудь помочь.

Дальнейшее уточнение: я хочу, чтобы в любом случае я получал нулевой счет, он также должен напечатать это.

В моей таблице базы данных для этого запроса не отображается регистр 'меньше 0':

COUNT(ID) AGERANGE       AGERANGESEQUENCE
-------------- -------------- ----------------
     11139 0-30                          2
      2292 31-60                         3
       329 61-90                         4
      1078 91+                           5
       746 NO INFORMATION                6

Это не показывает мне первый ряд счета 0.

Я тоже этого хочу, чтобы я мог получить четко определенную структуру таблицы.

Ответы [ 3 ]

2 голосов
/ 25 января 2012
SELECT coalesce(t.idcount, 0),
       c.agerangetext
FROM   (SELECT 1, 'less than 0' UNION ALL
        SELECT 2, '0-30'        UNION ALL
        SELECT 3, '31-60'       UNION ALL
        SELECT 4, '61-90'       UNION ALL
        SELECT 5, '91+'         UNION ALL
        SELECT 6, 'NO INFORMATION'
       ) AS c(agerange, agerangetext)
  LEFT OUTER JOIN (SELECT COUNT(id) AS idcount,
                          agerange
                   FROM   (SELECT id,
                                  CASE
                                    WHEN age < 0 THEN 1
                                    WHEN age >= 0 AND age <= 30 THEN 2
                                    WHEN age >= 31 AND age <= 60 THEN 3
                                    WHEN age >= 61 AND age <= 90 THEN 4
                                    WHEN age >= 91 THEN 5 
                                    WHEN age IS NULL THEN 6
                                  END AS agerange
                           FROM   QUEUE
                           WHERE  DATE BETWEEN '01-Apr-2011' AND '05-May-2011'
                          ) t
                   GROUP  BY agerange) AS t
    ON c.agerange = t.agerange
ORDER  BY c.agerange  

Рабочий образец

1 голос
/ 25 января 2012

Если вы хотите заказать по этому столбцу - просто добавьте

ORDER BY AgeRange

после предложения GROUP BY AgeRange:

SELECT
   COUNT(id), AgeRange
FROM
   ( ..... ) T
GROUP BY
    AgeRange
ORDER BY
    AgeRange

Если эта последовательность не сработает для вас, вам придется добавить второй оператор CASE, чтобы определить AgeRangeSequence для вашего внутреннего выбора, а затем упорядочить по этому столбцу:

SELECT
     COUNT(id), AgeRange, AgeRangeSequence
FROM
     (SELECT
          id,
          CASE
             WHEN age < 0 THEN 'less than 0'
             WHEN age >= 0 AND age <= 30 THEN '0-30'
             WHEN age >= 31 AND age <= 60 THEN '31-60'
             WHEN age >= 61 AND age <= 90 THEN '61-90'
             WHEN age >= 91 THEN '91+'
             WHEN age IS NULL THEN 'NO INFORMATION'
             ELSE 'no category'
          END AS AgeRange,
          CASE
             WHEN age < 0 THEN 1
             WHEN age >= 0 AND age <= 30 THEN 2
             WHEN age >= 31 AND age <= 60 THEN 3
             WHEN age >= 61 AND age <= 90 THEN 4
             WHEN age >= 91 THEN 5
             WHEN age IS NULL THEN 6   
             ELSE 7
           END AS AgeRangeSequence,
    FROM dbo.queue 
    WHERE [DATE] BETWEEN '01-Apr-2011' AND '05-May-2011'
   ) T
GROUP BY
    AgeRange, AgeRangeSequence
ORDER BY
    AgeRangeSequence

PS: в вашем операторе CASE вы должны проверить WHEN age IS NULL и , а не использовать WHEN age = NULL, поскольку вы не можете сравнить с NULL, используя обычные операторы сравнения!

0 голосов
/ 25 января 2012

Один из способов - использовать группу UNION:

SELECT 1, COUNT(id), 'less than 0'
FROM queue
WHERE age < 0 AND DATE BETWEEN '01-Apr-2011' and '05-May-2011'
UNION
SELECT 2, COUNT(id), '0-30'
FROM queue
WHERE age BETWEEN 0 AND 30 AND DATE between '01-Apr-2011' and '05-May-2011'
UNION
...
...