2013-05-02 50 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(甲骨文,SQL服務器,MySQL的,等等)。可能會有利用不被普遍支持的語言或產品功能的答案。此外,通過使用特定的RDBMS標記它,您的問題可能會得到更適合回答的人的關注。 – Taryn 2013-05-02 16:38:54

+1

你想要一個大串聯的課程和成績?爲什麼?根據你的表格結構,它看起來像你已經有了你需要的完全數據? – Matthew 2013-05-02 16:41:34

+0

這是SQL服務器。 – Think 2013-05-02 16:47:41

回答

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翻譯的速度更快:) – 2013-05-02 17:01:05

+0

@JoachimIsaksson我在等待查看它是什麼數據庫時一直在努力。 MySQL很容易做到這一點。 – Taryn 2013-05-02 17:02:38

+0

是的,在TSQL group_concat是一團糟: -/ – 2013-05-02 17:03:50

0

如果你正在尋找從「學生」的數據插入到「學生報告」,請嘗試:

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

我不認爲它會工作。 – Luv 2013-05-02 16:56:19

0

不使用CTE。提高性能。

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 

牛逼將新表名這不數據庫存在。

SQL Fiddle