各位好:
我有一個學生的成績表,因為考試分三種,我用了case陳述句把行裝列后得到的結果是:

結果不符合我的預期,我想要的結果是同一個學生成績合并成一行,如下圖所示:

請問各位大佬怎么才能直接在sql上實作。
附上原sql陳述句:
declare @r1 date
declare @r2 date
declare @r3 date
set @r1=(select top 1 日期 from [nicolas].[dbo].[分數] group by 日期 order by 日期 desc)
set @r2=(select top 1 日期 from [nicolas].[dbo].[分數] where 日期 not in (select top 1 日期 from [nicolas].[dbo].[分數] group by 日期 order by 日期 desc)group by 日期 order by 日期 desc)
set @r3=(select top 1 日期 from [nicolas].[dbo].[分數] where 日期 not in (select top 2 日期 from [nicolas].[dbo].[分數] group by 日期 order by 日期 desc) group by 日期 order by 日期 desc)
/*
print @r1
print @r2
print @r3
分別查詢出sat,雅思,清大的成績后再join 名單
*/
SELECT 班級,姓名,@r1 as 本次,
case when 日期=@r1 then 雅思總 end as '雅思總',
case when 日期=@r1 then SAT總 end as 'SAT總',
case when 日期=@r1 then 清大總 end as '清大總',
@r2 as 上次,
case when 日期=@r2 then 雅思總 end as '雅思總',
case when 日期=@r2 then SAT總 end as 'SAT總',
case when 日期=@r2 then 清大總 end as '清大總',
@r3 as 前次,
case when 日期=@r3 then 雅思總 end as '雅思總',
case when 日期=@r3 then SAT總 end as 'SAT總',
case when 日期=@r3 then 清大總 end as '清大總'
FROM [nicolas].[dbo].[分數] AS 分數 LEFT OUTER JOIN
[nicolas].[dbo].[名單] ON 姓名 = [nicolas].[dbo].[名單].中文名
order by 班級,姓名
uj5u.com熱心網友回復:
百度 sqlserver 行轉列按樓主題意,可以直接用固定列的行轉列,也就是不適用動態行轉列
如果列數是由表資料決定,那么建議使用動態行轉列的sql陳述句執行獲取相應結果集
uj5u.com熱心網友回復:
select 班級,姓名,本次,max(SAT總),上次,max(清大總),前次,max(雅思總) from(查到你現有結果的sql) group by 班級,姓名,本次,上次,前次
uj5u.com熱心網友回復:
你行轉列之前的表是什么樣的啊,發來看看唄uj5u.com熱心網友回復:
CREATE TABLE #T
(
班級 VARCHAR(20),
姓名 VARCHAR(20),
時間 DATE,
科目 VARCHAR(20),
分數 INT
)
INSERT INTO #T VALUES ('二班','郭xx','2020/10/10','SAT',800)
INSERT INTO #T VALUES ('二班','郭xx','2020/3/3','清大',55)
INSERT INTO #T VALUES ('二班','郭xx','2020/1/1','雅思',5)
INSERT INTO #T VALUES ('二班','王xx','2020/10/10','SAT',800)
INSERT INTO #T VALUES ('二班','王xx','2020/3/3','清大',55)
INSERT INTO #T VALUES ('二班','王xx','2020/1/1','雅思',5)
INSERT INTO #T VALUES ('三班','戚xx','2020/10/10','SAT',800)
INSERT INTO #T VALUES ('三班','戚xx','2020/3/3','清大',55)
INSERT INTO #T VALUES ('三班','戚xx','2020/1/1','雅思',5)
INSERT INTO #T VALUES ('四班','楊xx','2020/10/10','SAT',800)
INSERT INTO #T VALUES ('四班','楊xx','2020/3/3','清大',55)
INSERT INTO #T VALUES ('四班','楊xx','2020/1/1','雅思',5)
declare @sql varchar(max) =''
select @sql = @sql+
',max(case when a.時間='''+cast(t.時間 as varchar(20))+''' then a.科目 else NULL end) 科目 '+
',max(case when a.時間='''+cast(t.時間 as varchar(20))+''' then a.分數 else NULL end) 分數 '+
',max(case when a.時間='''+cast(t.時間 as varchar(20))+''' then a.時間 else NULL end) 時間 '
from #T t group by t.時間
set @sql = 'select a.班級,a.姓名'+ @sql +'from #T a group by a.班級,a.姓名'
exec(@sql)
drop table #T
按理來說行轉列不應該出現那種奇奇怪怪的情況啊

uj5u.com熱心網友回復:
你這分數表每個學生每個日期有各自的記錄,LEFT JOIN 當然會多條。應該在學生表里每個學生每個日期GROUP BY生成一個結果集,三個日期有3個結果集,然后再GROUP BY。
話說CASE WHEN 又沒根據學科欄位進行判斷,你分雅思、SAT有啥意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/236316.html
標籤:疑難問題
上一篇:SQL 求救 字串判斷
