2010-10-23 4 views
3

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

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 
+1

Укажите данные примера и ожидаемый результат, чтобы мы могли видеть, что вы пытаетесь выполнить. –

ответ

0

Данные вашего примера и ваш желаемый результат не совпадают. Где находятся значения 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 

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

+0

Извините, ваш apsolutly правильно, что выход не был уместен вообще. Однако вы сделали все правильно. и спасибо, что указали на необходимость того, чтобы (StudentID) также находился в предложении select. Однако после этого по какой-то причине он все еще возвращается с одним результатом. Есть ли шансы на пример кода? Поскольку я должен делать что-то неправильно, чтобы он не работал. – Tom

+0

Я добавил SQL к ответу выше. –

+0

Может ли быть причиной того, что вместо того, чтобы достичь нужных значений, а не только ценность, это проблема? Как ваш код работает отлично до тех пор, пока я не добавлю соединения? большое спасибо! – Tom

0

Удалите Max функции и группы по

SELECT, ау, случай, когда период = 1 ТОГДА Subj ИНАЧЕ NULL КОНЕЦ КАК P1, случай, когда период = 2 ТОГДА Subj ИНАЧЕ NULL КОНЕЦ КАК Р2
из классов

+0

Без GROUP BY и агрегата результирующий набор не сглаживается - у вас будет множество значений NULL. –

+0

Мой ответ больше не правильный, на основании измененного вопроса. – automatic

0

Верьте или нет, вы не должны удалить 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

Это только сжимает группировку - не имея дело с просьбой не использовать MAX. –

+0

Спасибо за это, я думаю, что не использовать max может быть только я думаю, что это была проблема. После применения дополнительного столбца я все равно получаю тот же результат только один ряд данных, когда я хочу их всех. Любые идеи? – Tom

+0

OMG Ponies прав ... вам нужно предоставить нам дополнительную информацию о данных, которые вы запрашиваете. Вот что: просто добавить любой другой столбец не получится. Это должен быть столбец или набор столбцов, которые делают предложение GROUP BY уникальным. Итак, вот трюк ... Каков первичный ключ на столе? Измените предложение GROUP BY так, чтобы он включал основной ключ вашей таблицы в конце, и вы получите все строки. Обещаю. –

Смежные вопросы