因此,我尝试从表格中提取数据,以便为该人提供每个分数,如果他们有两个分数,我希望将其与第二个分数放在一起。如果用户没有分数,我不希望任何回报。如果用户有一个分数,我的查询将返回第一个分数,如果没有,则返回第二个分数。但是,如果用户有两个分数,我不确定该如何在新行中返回该分数。
表1
+---------+--------+--------+
| name | score1 | score2 |
+---------+--------+--------+
| jim | null | 87 |
| doug | 21 | 45 |
| brandon | null | null |
| susy | 11 | null |
+---------+--------+--------+
我的查询给出的结果是
+------+----+
| jim | 87 |
| doug | 21 |
| susy | 11 |
+------+----+
想要的输出
+------+----+
| jim | 87 |
| doug | 21 |
| doug | 45 |
| susy | 11 |
+------+----+
我写的查询是
SELECT
name
,COALESCE(score1, score2)
FROM
table
WHERE
score1 IS NOT NULL
OR score2 IS NOT NULL
ORDER BY
name;
答案 0 :(得分:1)
将此作为两个单独的查询进行处理,并将结果与UNION ALL
组合在一起。在这种情况下,您不仅要UNION ALL
,而且要UNION
,这样,如果此人在两列中的分数都相同,就会得到两行返回。
SELECT name, Score1 as score
FROM table1
WHERE Score1 IS NOT NULL
UNION ALL
SELECT name, Score2 as score
FROM table1
WHERE Score2 IS NOT NULL
ORDER BY name, score;
答案 1 :(得分:1)
我会推荐cross apply
:
SELECT t.name, v.score
FROM table t CROSS APPLY
(VALUES (score1), (score2)) v(score)
WHERE v.score IS NOT NULL
ORDER BY name;
这通常是在SQL Server中取消数据透视的最有效方法。