sql - 每条记录都有一个新行
问题描述
我希望结果在满足条件的每个实例中生成一个新行。我正在使用 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)
这会产生:
我想要这个:
解决方案
使用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);
推荐阅读
- python - 限制 numpy 1.19.2 使用的线程数
- influxdb - 如何使用通量检查测量中是否存在标签?
- google-apps-script - Googlesheet - 如何在宏循环中跳过空单元格并继续填充单元格?
- mongodb - 我们可以在使用 Mongoose 插入文档的同时将子文档插入到不同的集合中吗?
- laravel - Laravel:将新日志添加到日志文件
- sql - 使用下一个 id 顺序查询选择
- jquery - 当列有链接时,数据表列选择过滤器排序()不起作用
- reactjs - React Native 中的 Scrollview 错误修复
- typescript - 使用枚举索引不正确地对小元组进行索引会触发 TS2493
- r - 如何检查值“TRUE”是否在 R 中连续出现 x 次?