显示行中具有空值的列名称

时间:2015-03-30 06:06:13

标签: sql sql-server sql-server-2008 pivot

我想只针对学生ID显示那些列名,其问题(q1,q2,q3,q4 ......等)值为null以下是针对id我想要问题id的表的打印屏幕。低于预期的o / p

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以使用FOR XML来获得结果:

SQL Fiddle

;WITH Cte AS(
    SELECT id, name, q = 'q1' FROM Test WHERE q1 IS NULL UNION ALL
    SELECT id, name, q = 'q2' FROM Test WHERE q2 IS NULL UNION ALL
    SELECT id, name, q = 'q3' FROM Test WHERE q3 IS NULL UNION ALL
    SELECT id, name, q = 'q4' FROM Test WHERE q4 IS NULL UNION ALL
    SELECT id, name, q = 'q5' FROM Test WHERE q5 IS NULL UNION ALL
    SELECT id, name, q = 'q6' FROM Test WHERE q6 IS NULL
)
SELECT
    id,
    name,
    incompletes = STUFF((
        SELECT ',' + c2.q
        FROM Cte c2
        WHERE
            c1.id = c2.id
            AND c1.name = c2.name
        GROUP BY c2.id, c2.name, c2.q
        FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
        , 1, 1, '')
FROM Cte c1
GROUP BY c1.id, c1.name
ORDER BY c1.id, c1.name

答案 1 :(得分:1)

SELECT ID, NAME, 
 RTRIM ((CASE WHEN Q1 IS NULL THEN 'Q1,' END)||
        (CASE WHEN Q2 IS NULL THEN 'Q2,' END)||
        (CASE WHEN Q3 IS NULL THEN 'Q3,' END)||
        (CASE WHEN Q4 IS NULL THEN 'Q4,' END)||
        (CASE WHEN Q5 IS NULL THEN 'Q5,' END)||
        (CASE WHEN Q6 IS NULL THEN 'Q6,' END),',') AS NULL_QUESTIONS
FROM TABLE  

编辑:添加STUFF以删除引导逗号并添加ELSE ''

SELECT ID, NAME,  
    STUFF (
        CASE WHEN Q1 IS NULL THEN ',q1' ELSE '' END +
        CASE WHEN Q2 IS NULL THEN ',q2' ELSE '' END +
        CASE WHEN Q3 IS NULL THEN ',q3' ELSE '' END +
        CASE WHEN Q4 IS NULL THEN ',q4' ELSE '' END +
        CASE WHEN Q5 IS NULL THEN ',q5' ELSE '' END +
        CASE WHEN Q6 IS NULL THEN ',q6' ELSE '' END
    , 1,1,'') AS NULL_QUESTIONS
FROM Test  

答案 2 :(得分:0)

SELECT Panelist_ID, EmailAddress collate Latin1_General_CI_AI,  
STUFF (
  CASE WHEN  convert (nvarchar (14), PQ_160175) IS NULL THEN ',PQ_160175'    ELSE '' END +
 CASE WHEN  convert (nvarchar (14), PQ_161979) IS NULL THEN ',PQ_161979'  ELSE '' END +
  CASE WHEN  convert (nvarchar (14), PQ_161980) IS NULL THEN ',PQ_161980'  ELSE '' END +
  CASE WHEN  convert (nvarchar (14), PQ_161981) IS NULL THEN ',PQ_161981'  ELSE '' END +
  CASE WHEN  convert (nvarchar (14), PQ_161982) IS NULL THEN ',PQ_161982'  ELSE '' END +
 CASE WHEN  convert (nvarchar (14), PQ_161983) IS NULL THEN ',PQ_161983'  ELSE '' END +
   CASE WHEN    convert (nvarchar (14), PQ_161986) IS NULL THEN ',PQ_161986'     ELSE '' END +
   CASE WHEN   PQ_172469 IS NULL THEN ',PQ_172469'  ELSE '' END +
    CASE WHEN   PQ_180972 IS NULL THEN ',PQ_180972'  ELSE '' END +
      CASE WHEN PQ_180973 IS NULL THEN ',PQ_180973'  ELSE '' END + 
      CASE WHEN PQ_189924 IS NULL THEN ',PQ_189924'  ELSE '' END +
     CASE WHEN PQ_195859 IS NULL THEN ',PQ_195859'  ELSE '' END +
    CASE WHEN PQ_195860 IS NULL THEN ',PQ_195860'  ELSE '' END +
    CASE WHEN PQ_196605 IS NULL THEN ',PQ_196605'  ELSE '' END +
    CASE WHEN PQ_196606 IS NULL THEN ',PQ_196606'  ELSE '' )

我一直在使用上述案例陈述,我无法看到161983年后的输出

enter image description here

相关问题