Замена NULL из результатов запроса CASE - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть следующий код, который генерирует данные, аналогичные моим. Публикация здесь ( PivotWithoutAggregateFunction ) предполагает, что использование оператора CASE вместо PIVOT лучше для нечисловых значений. Который, если это не так, то, наверное, сейчас самое время это исправить!

      DECLARE @QA1 TABLE (SID varchar(7), FormID varchar(max), DateExam date, Present varchar(3))
      INSERT INTO @QA1 VALUES(1, 'Form1', '20110101', 'Yes')
      INSERT INTO @QA1 VALUES(2, 'Form1', '20110201', 'Yes')
      INSERT INTO @QA1 VALUES(3, 'Form1', '20110301', 'Yes')
      INSERT INTO @QA1 VALUES(4, 'Form1', '20110401', 'Yes')
      INSERT INTO @QA1 VALUES(5, 'Form1', '20110122', 'Yes')
      INSERT INTO @QA1 VALUES(1, 'Form2', '20110222', 'Yes')
      INSERT INTO @QA1 VALUES(2, 'Form2', '20110322', 'Yes')
      INSERT INTO @QA1 VALUES(3, 'Form2', '20110422', 'Yes')
      INSERT INTO @QA1 VALUES(1, 'Form3', '20110128', 'Yes')
      INSERT INTO @QA1 VALUES(1, 'Form4', '20110228', 'Yes')
      INSERT INTO @QA1 VALUES(5, 'Form5', '20110328', 'Yes')
      INSERT INTO @QA1 VALUES(5, 'Form6', '20111228', 'Yes')
      INSERT INTO @QA1 VALUES(4, 'Form2', '20111228', 'Yes')

    SELECT SID,
    MIN(CASE FormID WHEN 'Form1' THEN Present END) AS 'First',
    MIN(CASE FormID WHEN 'Form2' THEN Present END) AS 'Second',
    MIN(CASE FormID WHEN 'Form3' THEN Present END) AS 'Third',
    MIN(CASE FormID WHEN 'Form4' THEN Present END) AS 'Fourth',
    MIN(CASE FormID WHEN 'Form5' THEN Present END) AS 'Fifth',
    MIN(CASE FormID WHEN 'Form6' THEN Present END) AS 'Sixth'

    FROM @QA1

    GROUP BY SID
    ORDER BY SID

Тем не менее, выходные данные имеют NULL в строке / столбце, которые не имеют каких-либо форм, которые, хотя и правильные, мне намного сложнее читать.

      SID    First  Second   Third  Fourth   Fifth   Sixth
       1      Yes    Yes      Yes     Yes     NULL    NULL
       2      Yes    Yes      NULL    NULL    NULL    NULL
       3      Yes    Yes      NULL    NULL    NULL    NULL
       4      Yes    Yes      NULL    NULL    NULL    NULL
       5      Yes    NULL     NULL    NULL    Yes     Yes

Как я могу изменить свой CASE, чтобы я либо ничего не получил (т.е. ''), либо хотя бы "Нет"?

Ответы [ 3 ]

2 голосов
/ 05 сентября 2011

Вы должны быть в состоянии обернуть COALESCE в обидные MIN, например:

COALESCE(MIN(CASE FormID WHEN 'Form1' THEN Present END), 'No') AS 'First',

Я не уверен, насколько SQL Server будет доволен этим, но это довольно стандартный SQL.

Применить настройку NULL после . Возможно, MIN - лучший вызов, чем попытка выбрать безопасное значение для помещения в MIN.

1 голос
/ 05 сентября 2011
 SELECT SID,
    isnull(MIN(CASE FormID WHEN 'Form1' THEN Present END),'') AS 'First',
    isnull(MIN(CASE FormID WHEN 'Form2' THEN Present END),'') AS 'Second',
    isnull(MIN(CASE FormID WHEN 'Form3' THEN Present END),'') AS 'Third',
    isnull(MIN(CASE FormID WHEN 'Form4' THEN Present END),'') AS 'Fourth',
    isnull(MIN(CASE FormID WHEN 'Form5' THEN Present END),'') AS 'Fifth',
    isnull(MIN(CASE FormID WHEN 'Form6' THEN Present END),'') AS 'Sixth'

или

  SELECT SID,
    isnull(MIN(CASE FormID WHEN 'Form1' THEN Present END),'No') AS 'First',
    isnull(MIN(CASE FormID WHEN 'Form2' THEN Present END),'No') AS 'Second',
    isnull(MIN(CASE FormID WHEN 'Form3' THEN Present END),'No') AS 'Third',
    isnull(MIN(CASE FormID WHEN 'Form4' THEN Present END),'No') AS 'Fourth',
    isnull(MIN(CASE FormID WHEN 'Form5' THEN Present END),'No') AS 'Fifth',
    isnull(MIN(CASE FormID WHEN 'Form6' THEN Present END),'No') AS 'Sixth'
0 голосов
/ 05 сентября 2011

Это идеальный запрос для оператора PIVOT.

SELECT
  SID,
  COALESCE([Form1],'No') AS [First],
  COALESCE([Form2],'No') AS [Second],
  COALESCE([Form3],'No') AS [Third],
  COALESCE([Form4],'No') AS [Fourth],
  COALESCE([Form5],'No') AS [Fifth],
  COALESCE([Form6],'No') AS [Sixth]
FROM (
  SELECT SID, FormID, Present FROM @QA1
) S
PIVOT (
  MIN(Present)
  FOR FormID IN ([Form1],[Form2],[Form3],[Form4],[Form5],[Form6])
) AS P
ORDER BY SID;
...