2010-10-06 2 views
1

У меня есть представление, которое содержит (среди других столбцов) заголовок «имя» и столбец «рейтинг». Представление соединяет заголовок с таблицей элементов, поэтому столбец имен из заголовка повторяется для каждого элемента.sql запрос для отчета

Мне нужно запустить отчет на столе; в идеале, я бы получил 5 столбцов в результате sql; заголовок «имя» и 4 копии столбца «рейтинг», где каждая копия столбца рейтинга показывает количество оценок, которые превышают определенный порог. Таким образом, столбец рейтинга # 1 покажет количество элементов в таблице (для заголовка элемента), которые имеют рейтинг 1 или выше, второй столбец рейтинга покажет количество элементов в таблице (для заголовка того же элемента), которые имеют рейтинг 5 или выше и т. д.

Я знаю, как получить имя и 1 рейтинг колонки назад:

select name, count(rating) as cnt1 from myview where rating > 1 group by name 

но комбинируя, что с другими желаемыми рейтинговыми столбцов не удается мне в данный момент. Пробовал использовать предложение «union», но это просто помещает несколько строк в список результатов. Абсолютное требование (запрос должен подключаться к шаблону отчета, так что это очень негибкий) состоит в том, что у меня есть только одна строка, возвращаемая для каждого уникального поля «имя» в представлении, потому что иначе объект отчета, который будет читать данные не будут знать, как интерпретировать результаты.

Любые советы?

Update Вот некоторые примерные данные:

name, rating 
myname1, 1 
myname1, 1 
myname1, 10 
myname1, 4 
myname1, 7 
myname1, 3 
myname1, 5 
myname1, 5 
myname1, 4 
myname2, 2 
myname2, 10 
myname2, 6 
myname2, 8 
myname2, 5 
myname2, 4 
myname2, 6 

И желаемый результат:

name, cnt1, cnt5, cnt7, cnt8 
myname1, 7, 2, 1, 1 
myname2, 7, 4, 2, 1 

... где СЧТ1 = оценка> 1, cnt5 = оценка> 5, CNT7 = рейтинг > 7, cnt8 = оценка> 8

+0

@ user85116, Вы можете разместить табличный макет данных и то, что вы хотите чтобы выйти? – Brad

+0

Использовать сумму (кол-во (рейтинг))? – Emerion

ответ

3
select name, 
     sum(case when rating > 1 then 1 else 0 end) as cnt1, 
     sum(case when rating > 5 then 1 else 0 end) as cnt2 
     /* ... repeat as many times as needed */ 
    from myview 
    group by name 
+0

Большое спасибо! Не знаю, как это можно сделать в функции «sum». Узнавайте что-то новое каждый день :) – user85116

0

выберите имя, SUM (CASE WHEN рейтинг> 1 THEN 1 ELSE 0 END), как cnt1, SUM (CASE WHEN рейтинг> 5 THEN 1 ELSE 0 END), как cnt5 из MyView группы по имени