sql pivot без агрегатов - PullRequest
       55

sql pivot без агрегатов

3 голосов
/ 23 октября 2010

При попытке развернуть таблицу sql я наткнулся на этот пост Здесь .Используя этот метод, я создал запрос.Однако теперь я понял, что он, конечно, объединяет результаты с функцией MAX.Однако мне нужно, чтобы Колум развернулся, но чтобы все события были показаны.Код взят сверху постом.

  SELECT dy,
         MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
         MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,    
    FROM Classes
GROUP BY dy

Итак, по сути, я хочу использовать это, но без функции max?Есть идеи?

Редактировать Пример данных

Day   Period    Subject

Mon   1         Ch
Mon   2         Ph
Tue   1         Ph
Tue   2         Ele
Mon   1         Ch
Mon   2         Ph
Tue   1         Ph
Tue   2         Ele

пример вывода

Day   P1   P2   

Mon   Ch   Ph   
Mon   Ch   Ph   
Tue   Ph   Ele  
Tue   Ph   Ele  

в общем случае, если данные вводятся дважды, они появляются дважды ...

Редактироватьфактический sql ..

  SELECT other
         MAX(CASE WHEN period = 1 THEN table2.subj ELSE NULL END) AS P1,
         MAX(CASE WHEN period = 2 THEN table2.subj ELSE NULL END) AS P2    
    FROM table1
left join table2 on table2.ID = subject

GROUP BY other

Пример данных

Table1

Dy   Period    Subject other

Mon   1         1       1
Mon   2         2       1
Tue   1         3       2
Tue   2         4       2
Mon   1         5       3
Mon   2         6       3
Tue   1         7       4
Tue   2         8       4

table2

ID  Subj
1 ch
2 ph
3 ph
4 ele
5 ch
6 ph
7 ph
8 Ele

пример вывода

Day   P1   P2   other

Mon   Ch   Ph   1
Mon   Ch   Ph   3
Tue   Ph   Ele  2
Tue   Ph   Ele  4

Ответы [ 3 ]

0 голосов
/ 23 октября 2010

Верьте или нет, вам не нужно удалять агрегатную функцию MAX(), чтобы получить все результаты.Вы можете получить нужные вам строки, просто добавив дополнительные критерии к предложению GROUP BY, так что вы получите все нужные результаты.

Например, если dy уникально, вы получите все результатыно если у вас есть другой столбец, который делает ваше предложение GROUP BY уникальным, вы можете просто добавить его, и вы получите все результаты.Допустим, этот столбец называется id:

  SELECT dy,id,
         MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
         MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,    
    FROM Classes
GROUP BY dy, id
0 голосов
/ 23 октября 2010

Ваш пример данных и желаемый результат не совпадают. Откуда значения Mth, CS2, Lab и Hu поступают в вывод? Их нет на входе.

Не совсем понятно, что вы пытаетесь сделать, но при условии, что отдельные строки в вашем выводе для (например) Mon, представляющие двух разных учащихся, вам нужно включить отличительный столбец (StudentID) в ваш список SELECT и предложение GROUP BY. Тогда вы можете безопасно использовать MAX не для агрегации (поскольку в выходной ячейке будет только одно значение), а для того, чтобы заставить двигатель сделать поворот за вас.

Вот SQL с включенным идентификатором студента:

SELECT student_id, dy,
     MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
     MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,    
FROM Classes
GROUP BY student_id, dy

Это вернет одну запись для каждого учащегося за каждый день, показывающую их ежедневное расписание занятий. Если вы хотите, чтобы вывод был отсортирован по дням, затем student, измените порядок student_id и dy в предложениях SELECT и GROUP BY.

0 голосов
/ 23 октября 2010

Удалите функции Max и группу с помощью

SELECT DY, СЛУЧАЙ, КОГДА период = 1, ТОЛЬКО ПОСЛЕ ИЛИ НУЛЕВОЙ КОНЕЦ КАК P1, СЛУЧАЙ, КОГДА период = 2, ТОЛЬКО ПОСЛЕ ИЛИ НЕДЕЙСТВИТЕЛЬНО КОНЕЦ КАК P2
ОТ занятий

...