2012-01-25 15 views
0

я есть следующий запрос рабочего ..случай, когда группировка в SQL

select count(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 
from queue where DATE between '01-Apr-2011' and '05-May-2011' 
group by 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 
/

теперь мое требование заключается в том, что я не хочу использовать пункт СЛУЧАЙ снова для группировки его со счетом .. используя пункт CASE, только один раз я хочу получить тот же результат.

также я хочу, чтобы последовательность всегда сопровождалась результатом этого запроса. для ex всегда всегда печатает счетчик для «меньше 0», а затем для «0-30» и так далее на .. даже если есть 0 счет, найденный для интервала, скажем 31-60, он должен напечатать 0 для этого интервала ...

может кто-нибудь помочь PLZZ .. Thanx заранее

+0

также я хочу последовательность всегда быть с последующим результатом этого запроса .. напр всегда Шуд печатаемых рассчитывать первый для «меньше чем 0», то для «0-30» и так далее .. даже если есть 0 счет, найденный для интервала, скажем, 31-60, он должен напечатать 0 для этого интервала .. – Pramod

ответ

3

Вы имеют к группе на всех необобщенных, непостоянные столбцов и выражений Таким образом, вы либо повторить весь СЛУЧАЙ или использовать производную таблицу как это, если вы не хотите повторить.

Это стандарт SQL, должны работать во все мейнстрим RDBMS

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; 

Edit: Обратите внимание, я псевдонимы случае, как AgeRange и сгруппирован по этому вопросу.

GROUP BY (ordinal) не является стандартным SQL. Она не работает в SQL Server

+0

спасибо, что дал быстрый ответ ... он нормально работает по мере необходимости .. – Pramod

+0

@OlegDok: no, GROUP BY 2 ** isn ' t ** стандартный SQL. – gbn

+0

@gbn - Пропущенный ответ, это не было предназначено для вас. Между тем - +1 для более простого ответа –

1
SELECT count(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 
FROM queue 
WHERE DATE BETWEEN '01-Apr-2011' AND '05-May-2011' 
GROUP BY 1 
+0

Группа на 2, возможно? –

+0

Вы имели в виду GROUP BY 2? - Не всегда будет работать –

+0

Я считаю, что GROUP BY 1 подразумевает - «группа по первому столбцу без агрегата». count (id) не будет рассматриваться как столбец номер один, поскольку он является совокупным столбцом (если это правильный термин). –

1

Используйте определенные пользователем функции, как:

CREATE FUNCTION CaseGrouping(@age int) 
RETURNS varchar(100) 
AS 
BEGIN 
    return 
    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 
END 

и тогда ваш выбор будет выглядеть следующим образом:

select count(id), dbo.CaseGrouping(age) 
from queue where DATE between '01-Apr-2011' and '05-May-2011' 
group by dbo.CaseGrouping(age) 

/

1

вы может использовать основную часть вашего запроса в подзапросе, эффективно предоставляя выражение CASE имя, которое может использоваться в предложении GROUP BY:

SELECT class, COUNT(id) 
    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 category' 
       END AS class 
      FROM queue AS q 
     WHERE q.date BETWEEN '01-Apr-2011' AND '05-May-2011' 
     ) AS g 
GROUP BY class; 
Смежные вопросы