Новая строка для каждой записи - PullRequest
0 голосов
/ 12 июня 2018

Я бы хотел, чтобы результаты создавали новую строку в каждом случае, когда выполняется условие.Я использую оператор CASE, но это не тот путь, поскольку после выполнения первого условия он прекращает оценку поля.

SELECT 
Reviews.ReviewID, 
CASE 
    WHEN Score_CorrectID = 0 THEN 'Correct ID Right Party Authentication'  
    WHEN Score_ProperlyIdentified = 0 THEN 'PCA Properly Identified Itself'
    WHEN Score_MiniMiranda = 0 THEN 'Mini-Miranda'          
END AS [Error Type] 
FROM Reviews INNER JOIN PCAs ON Reviews.PCAID = PCAs.PCAID LEFT JOIN 
PCARebuttal ON Reviews.ReviewID = PCARebuttal.ReviewID 
WHERE 
 (Score_CorrectID = 0 OR Score_ProperlyIdentified = 0 OR Score_MiniMiranda = 
0)

Это приводит к следующему:

enter image description here

Мне бы хотелось:

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Использование apply:

SELECT r.ReviewID, v.error_type
FROM Reviews r INNER JOIN
     PCAs
     ON r.PCAID = PCAs.PCAID LEFT JOIN 
     PCARebuttal pr
     ON r.ReviewID = pr.ReviewID OUTER APPLY
     (SELECT *
      FROM (VALUES (Score_CorrectID, 'Correct ID Right Party Authentication'),  
                   (Score_ProperlyIdentified, 'PCA Properly Identified Itself'),
                   (Score_MiniMiranda, 'Mini-Miranda')
           ) v(score, error_type)
      WHERE score = 0
     ) v        
WHERE (Score_CorrectID = 0 OR Score_ProperlyIdentified = 0 OR Score_MiniMiranda = 0);

Тем не менее, я бы, вероятно, просто объединил значения в один столбец:

SELECT r.ReviewID,
       ( (CASE WHEN Score_CorrectID = 0 THEN 'Correct ID Right Party Authentication; ' ELSE '' END) +  
         (CASE WHEN Score_ProperlyIdentified = 0 THEN 'PCA Properly Identified Itself; ' ELSE '' END) +
         (CASE WHEN Score_MiniMiranda = 0 THEN 'Mini-Miranda;' ELSE '' END)
       ) as error_types
FROM Reviews r INNER JOIN
     PCAs
     ON r.PCAID = PCAs.PCAID LEFT JOIN 
     PCARebuttal pr
     ON r.ReviewID = pr.ReviewID OUTER APPLY
     (SELECT *
      FROM (VALUES ()
           ) v(score, error_type)
      WHERE score = 0
     ) v        
WHERE (Score_CorrectID = 0 OR Score_ProperlyIdentified = 0 OR Score_MiniMiranda = 0);
0 голосов
/ 12 июня 2018

Вместо использования case вы можете использовать union all вместо:

SELECT 
    Reviews.ReviewID, 
    'Correct ID Right Party Authentication' AS [Error Type] 
FROM Reviews 
    INNER JOIN PCAs ON Reviews.PCAID = PCAs.PCAID 
    LEFT JOIN PCARebuttal ON Reviews.ReviewID = PCARebuttal.ReviewID 
WHERE Score_CorrectID = 0 
UNION ALL
SELECT 
    Reviews.ReviewID, 
    'PCA Properly Identified Itself' AS [Error Type] 
FROM Reviews 
    INNER JOIN PCAs ON Reviews.PCAID = PCAs.PCAID 
    LEFT JOIN PCARebuttal ON Reviews.ReviewID = PCARebuttal.ReviewID 
WHERE Score_ProperlyIdentified = 0 
UNION ALL
SELECT 
    Reviews.ReviewID, 
    'Mini-Miranda' AS [Error Type] 
FROM Reviews 
    INNER JOIN PCAs ON Reviews.PCAID = PCAs.PCAID 
    LEFT JOIN PCARebuttal ON Reviews.ReviewID = PCARebuttal.ReviewID 
WHERE Score_MiniMiranda = 0 
...