如果值也在第二列中,则SQL添加新行

时间:2018-11-21 21:44:43

标签: sql sql-server

因此,我尝试从表格中提取数据,以便为该人提供每个分数,如果他们有两个分数,我希望将其与第二个分数放在一起。如果用户没有分数,我不希望任何回报。如果用户有一个分数,我的查询将返回第一个分数,如果没有,则返回第二个分数。但是,如果用户有两个分数,我不确定该如何在新行中返回该分数。

表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;

2 个答案:

答案 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中取消数据透视的最有效方法。