Sql 将行移动到没有空值的列
结果如下Sql 将行移动到没有空值的列,sql,sql-server,tsql,Sql,Sql Server,Tsql,结果如下 SELECT st.suniq, sd.firstname, sd.lastname, tD.testuniq, - CASE WHEN (td.subtestc)='LI' THEN st.testscore END AS [CELDT Listening], --CASE WHEN (td.subtestc)='SP' THEN st.testscore END AS [CELDT Speaking], --CASE WHEN
SELECT
st.suniq,
sd.firstname,
sd.lastname,
tD.testuniq,
- CASE WHEN (td.subtestc)='LI' THEN st.testscore END AS [CELDT Listening],
--CASE WHEN (td.subtestc)='SP' THEN st.testscore END AS [CELDT Speaking],
--CASE WHEN (td.subtestc)='RD' THEN st.testscore END AS [CELDT Reading],
--CASE WHEN (td.subtestc)='WR' THEN st.testscore END AS [CELDT Writing],
--CASE WHEN (td.subtestc)='TO' THEN st.testscore END AS [CELDT Overall],
td.testc,
td.subtestc,
zst.descript,
st.takendt,
st.grdlvl,
st.testscore
FROM dbo.stutests st
JOIN dbo.testdef td ON td.testuniq=st.testuniq
JOIN studemo sd ON sd.suniq=st.suniq
JOIN zsubtest zst ON zst.subtestc=td.subtestc
WHERE tscrtypc='S'
AND td.testc='CELDT'
AND takendt LIKE '%2013%';
我想记录每个人的回报,没有空值
suniq firstname lastname subtestc descript grdlvl testscore
254585 Brenda Cazares LI CELDT Listening 8 534
254585 Brenda Cazares SP CELDT Speaking 8 612
254585 Brenda Cazares RD CELDT Reading 8 571
254585 Brenda Cazares WR CELDT Writing 8 680
254585 Brenda Cazares WR CELDT overall 8 710
当我在case语句中编译时,它给我空值。我想我需要一个pivot和case语句的组合。任何人都有任何建议,请提前表示感谢。您就快到了,只需将案例陈述包装在Max aggregate中即可
suniq firstname lastname Listening Speaking Reading Writing Overall grdlve
254585 Brenda Cazares 534 612 571 680 710 8
作为基本概念使用。您忘记了条件聚合中的其他0,或者在。。。。终止0@Vasily-在上述情况下,不需要
SELECT suniq ,
firstname ,
lastname ,
COALESCE([LI], 0) AS Listening ,
COALESCE([SP], 0) AS Speaking ,
COALESCE([RD], 0) AS Reading ,
COALESCE([WR], 0) AS Writing ,
COALESCE([TO], 0) AS Overall ,
st.grdlvl
FROM ( SELECT st.suniq ,
sd.firstname ,
sd.lastname ,
tD.testuniq ,
td.subtestc ,
td.testc ,
td.subtestc ,
zst.descript ,
st.takendt ,
st.grdlvl ,
st.testscore
FROM dbo.stutests st
JOIN dbo.testdef td ON td.testuniq = st.testuniq
JOIN studemo sd ON sd.suniq = st.suniq
JOIN zsubtest zst ON zst.subtestc = td.subtestc
WHERE tscrtypc = 'S'
AND td.testc = 'CELDT'
AND takendt LIKE '%2013%'
) T PIVOT ( SUM(testscore) FOR [subtestc] IN ( [LI], [SP], [RD], [WR],
[TO] ) ) AS Pvt
SELECT st.suniq,
sd.firstname,
sd.lastname,
Max(CASE WHEN td.subtestc = 'LI' THEN st.testscore END) AS [Listening],
Max(CASE WHEN td.subtestc = 'SP' THEN st.testscore END) AS [Speaking],
Max(CASE WHEN td.subtestc = 'RD' THEN st.testscore END) AS [Reading],
Max(CASE WHEN td.subtestc = 'WR' THEN st.testscore END) AS [Writing],
Max(CASE WHEN td.subtestc = 'TO' THEN st.testscore END) AS [Overall],
st.grdlvl,
FROM dbo.stutests st
JOIN dbo.testdef td
ON td.testuniq = st.testuniq
JOIN studemo sd
ON sd.suniq = st.suniq
JOIN zsubtest zst
ON zst.subtestc = td.subtestc
WHERE tscrtypc = 'S'
AND td.testc = 'CELDT'
AND takendt LIKE '%2013%'
GROUP BY st.suniq,
sd.firstname,
sd.lastname,
st.grdlvl