【问题标题】:Shifting Rows to columns with no nulls将行移动到不带空值的列
【发布时间】:2014-12-23 16:26:22
【问题描述】:
   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

我想按人记录返回,不包含空值

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

当我构建 case 语句时,它给了我空值。我想我需要一个枢纽和案例陈述的组合。任何人有任何建议和提前感谢。

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

你快到了,只需将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 

【讨论】:

  • 您在条件聚合中忘记了“else 0”,或者 MAX(COALESCE(CASE WHEN .... END,0))
  • @Vasily - 在上述情况下不需要
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2017-05-16
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多