2013-05-02 3 views
0

У меня есть следующие студенты столSQL Query, как суммировать запись студентов по дате?

Id StudentId  Subject   Date   Grade 

1 001  Math  02/20/2013 A 

2 001  Literature 03/02/2013 B 

3 002  Biology  01/01/2013 A 

4 003  Biology  04/08/2013 A 

5 001  Biology  05/01/2013 B 

6 002  Math  03/10/2013 C 

мне нужно привести в другой таблицы называется StudentReport, как показано ниже. Эта таблица представляет собой совокупный отчет всех записей студентов в хронологическом порядке по дате.

Id StudentId  Report 

1 001  #Biology;B;05/01/2013#Literature;B;03/02/2013#Math;A;02/20/2013 

2 002  #Math;C;03/10/2013#Biology;A;01/01/2013 

3 003  #Biology;A;04/08/2013 
+3

Пожалуйста, укажите RDBMS, что вы ориентируетесь, добавив соответствующий тег (Oracle, SQL Server, MySQL и т.д.). Могут быть ответы, которые используют преимущества языка или функций продукта, которые не поддерживаются повсеместно. Кроме того, пометив его конкретными СУБД, ваш вопрос может привлечь внимание от людей, более подходящих для ответа на него. – Taryn

+1

Вы хотите, чтобы курс и сорт в большой конкатенированной строке? Зачем? Основываясь на вашей структуре таблицы, мне кажется, что у вас уже есть данные, которые вам нужны? – Matthew

+0

Это SQL-сервер. – Think

ответ

3

Обычно вы не храните эти данные в таблице, у вас есть все данные, необходимые для создания отчета.

SQL Server не имеет легкий способ создания разделенных запятыми список, так что вы должны будете использовать FOR XML PATH для создания списка:

;with cte as 
(
    select id, 
    studentid, 
    date, 
    '#'+subject+';'+grade+';'+convert(varchar(10), date, 101) report 
    from student 
) 
-- insert into studentreport 
select distinct 
    studentid, 
    STUFF(
     (SELECT cast(t2.report as varchar(50)) 
      FROM cte t2 
      where c.StudentId = t2.StudentId 
      order by t2.date desc 
      FOR XML PATH ('')) 
      , 1, 0, '') AS report 
from cte c; 

См SQL Fiddle with Demo (включает в себя вставку в новую таблицу). Дайте результат:

| ID | STUDENTID |               REPORT | 
------------------------------------------------------------------------------------ 
| 10 |   1 | #Biology;B;05/01/2013#Literature;B;03/02/2013#Math;A;02/20/2013 | 
| 11 |   2 |       #Math;C;03/10/2013#Biology;A;01/01/2013 | 
| 12 |   3 |           #Biology;A;04/08/2013 | 
+0

+1 Сделал это в MySQL, но вы были быстрее с переводом TSQL :) –

+0

@JoachimIsaksson Я работал над тем и другим, ожидая увидеть, какая именно база данных. MySQL намного проще сделать это. – Taryn

+0

Да, group_concat в TSQL - это беспорядок: -/ –

0

Если вы хотите вставить данные из «студентов» в «Студенческий отчет», попробуйте:

INSERT INTO StudentReport (ID, StudentID, Report) 
SELECT ID, StudentID, '#' + subject + ';' + grade + ';' + date AS report 
FROM Students 
+0

Я не думаю, что это сработает. – Luv

0

Без использования КТР .Improve производительность.

FOR XML

(select 
min(ID) as ID, 
StudentId, 
STUFF((select ', '+'#'+s2.Subject+';'+s2.Grade+';'+convert(varchar(25),s2.Date) 
from student s2 
where s2.StudentId=s1.StudentId 
FOR XML PATH ('')) 
,1,2,'') as report 
into t 
from student s1 
group by StudentId) 
; 

select * from t 

Где т будет новый Table Name, который не существует в DataBase.

SQL Fiddle

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