2012-05-28 2 views
1

У меня достаточно простая проблема, которая была на удивление трудно найти в Интернете. Возможно, я ищу неправильные ключевые слова, поэтому я хотел остановиться и спросить вас, ребята, потому что ваш сайт был благословением в моих исследованиях. Ниже приводится сценарий:SQL Server - Возможное сводное решение?

Выберите ученика, считайте (*) как Итого, (неизвестная переменная: book1, book2, book3, book4, ect ...) из мистерий.

По существу, все, что я хотел бы сделать, это перечислить все книги для уникального идентификатора студента, который соответствует суммарному счету. Может ли кто-нибудь указать мне в правильном направлении, хорошее чтение или что-то еще, чтобы я мог сделать шаг в правильном направлении? Я предполагаю, что это будет сделано через левое соединение (не уверен, как сделать часть x1, x2, x3), а затем просто свяжите их по уникальному номеру студента (без дубликатов), но все онлайн-точки для поворота, но появляется точка поворота помещать все строки в столбцы вместо одного столбца. SQL Server 2005 является платформой выбора.

Спасибо!

К сожалению

Следующий запрос выдает свой уникальный идентификатор (ученика) и подсчет студента для всех дублирующих записей в таблице:

select student, count(*) as Total 
from mystudies 
group by student order by total desc 

часть я не знаю, как создать левый присоединиться на столе уникальный идентификатор (boookid)

select mystudies1.student, mystudies1.total, mystudies2.bookid 
from ( select student, count(*) as Total 
     from mystudies 
     group by student 
    ) mystudies1 
     left join 
     ( select student, bookid 
     from mystudies 
    ) mystudies2 
     on mystudies1.student=mystudies2.student 
order by mystudies1.total desc, mystudies1.student asc 

Очевидно, что выше строка будет давать результаты, аналогичные приведенным ниже:

Student Total BookID 
000001 3  100001 
000001 3  100002 
000001 3  100003 
000002 2  200001 
000002 2  200002 
000003 1  300001 

Но то, что я на самом деле хочу что-то похожее на следующее:

Student Total BookID 
000001  3  100001, 100002, 100003 
000002  2  200001, 200002 
000003  1  300001 

Я предположил, что это должно было быть сделано в левой присоединиться к так, что она не изменяет фактическое количество будучи выполненных по студенту. благодаря!

+0

Вы должны разместить некоторые данные образца, а затем желаемые результаты. – Taryn

+0

Похоже, вы хотите объединить все поля вместе. Это функция конкатенации агрегации строк. И, как вы это делаете, многое зависит от базы данных. Возможно, вам захочется найти эту идею, чтобы получить то, что вы хотите. –

+0

Ваш вопрос очень повествовательный. Попробуйте перефразировать его, используя примерный набор данных, SQL, который вы пробовали до сих пор, и каков ваш ожидаемый результат. –

ответ

3

В SQL-сервер использовать для XML Path Method:

SELECT Student, 
     Total, 
     STUFF((SELECT ', ' + BookID 
       FROM MyStudies books 
       WHERE Books.Student = MyStudies.Student 
       FOR XML PATH(''), TYPE 
       ).value('.', 'VARCHAR(MAX)'), 1, 2, '') AS Books 
FROM ( SELECT Student, COUNT(*) AS Total 
      FROM myStudies 
      GROUP BY Student 
     ) MyStudies 

Я ранее дал полное объяснение того, как XML PATH метод работает here.С дальнейшим усовершенствованием мой ответ указал here

SQL Server Fiddle


В MySQL И SQLite вы можете использовать GROUP_CONCAT функцию:

SELECT Student, 
     COUNT(*) AS Total, 
     GROUP_CONCAT(BookID) AS Books 
FROM myStudies 
GROUP BY Student 

MySQL Fiddle

SQLite Fiddle


В Postgresql вы можете использовать ARRAY_AGG Функция:

SELECT Student, 
     COUNT(*) AS Total, 
     ARRAY_AGG(BookID) AS Books 
FROM myStudies 
GROUP BY Student 

Postgresql Fiddle


В оракула вы можете изменить значение LISTAGG Номер функции

SELECT Student, 
     COUNT(*) AS Total, 
     LISTAGG(BookID, ', ') WITHIN GROUP (ORDER BY BookID) AS Books 
FROM myStudies 
GROUP BY Student 

Oracle SQL Fiddle


+0

Спасибо. Как только я прочитал предложение Гордона, я смог найти эффективное решение через рекурсивный cte, используя аналогичный подход к вашему размещенному методу пути XML. Спасибо за толкание в правильном направлении, потому что он спас мне часы времени в Google. – TStewartFan

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