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

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

 TStewartFan29 мая 2012 г., 01:44
Благодарю. Я буду читать по этой теме!
 Jon Egerton29 мая 2012 г., 01:11
Ваш вопрос очень повествовательный. Попробуйте перефразировать его, используя пример набора данных, SQL, который вы уже пробовали, и ожидаемый результат.
 Taryn♦29 мая 2012 г., 01:01
Вы должны опубликовать пример данных, а затем желаемые результаты.
 Gordon Linoff29 мая 2012 г., 01:08
Похоже, вы хотите объединить все поля вместе. Это функция объединения строк. И то, как вы это делаете, сильно зависит от базы данных. Вы можете искать эту идею, чтобы получить то, что вы хотите.

Ответы на вопрос(1)

Решение Вопроса

В SQL-сервере используйте метод FOR XML Path:

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Вот, При дальнейшем улучшении мой ответ указалВот

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

 TStewartFan30 мая 2012 г., 04:51
Благодарю. Как только я прочитал предложение Гордона, я смог найти эффективное решение с помощью рекурсивного cte, используя подход, аналогичный вашему опубликованному методу XML Path. Спасибо за толчок в правильном направлении, потому что это сэкономило мне часы Google.

Ваш ответ на вопрос