2014-12-23 3 views
1
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%'; 

Результаты являются следующиеShifting строк в столбцы, без провалов

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 

Я хочу вернуться на запись на человека, без провалов

suniq firstname lastname Listening Speaking Reading Writing Overall grdlve 
    254585 Brenda  Cazares  534  612  571  680  710  8 

Когда я строю в сазе это дает мне нули. Я думаю, мне нужна сводная информация о сводной и случайной ситуации. У кого-нибудь есть предложения и благодарности заранее.

+0

Используйте [этот ответ] (http://stackoverflow.com/a/26357449/2055998) в качестве основной идеи. –

+0

вы можете попробовать 'pivot' –

ответ

0

Вы были почти там просто нужно обернуть case statement внутри Max aggregate

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 
+1

вы забыли« else 0 »в условной агрегации или MAX (COALESCE (CASE WHEN .... END, 0)) – Vasily

+0

@Vasily - в вышеуказанном случае он не нужен –

0
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 
Смежные вопросы