Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果值也在第二列中,则SQL添加新行_Sql_Sql Server - Fatal编程技术网

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

如果值也在第二列中,则SQL添加新行,sql,sql-server,Sql,Sql Server,所以我试着从表中提取数据,给我每个人的分数,如果他们有两个分数,我希望它与第二个分数在一条新的线上。如果用户没有分数,我不希望返回任何内容。如果用户有第一个分数,我的查询将返回第一个分数;如果用户没有,则返回第二个分数。但是如果用户有两个分数,我不确定如何在新行中返回该分数 表1 +---------+--------+--------+ | name | score1 | score2 | +---------+--------+--------+ | jim | null

所以我试着从表中提取数据,给我每个人的分数,如果他们有两个分数,我希望它与第二个分数在一条新的线上。如果用户没有分数,我不希望返回任何内容。如果用户有第一个分数,我的查询将返回第一个分数;如果用户没有,则返回第二个分数。但是如果用户有两个分数,我不确定如何在新行中返回该分数

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

将其视为两个单独的查询,并将结果与
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;  

将其视为两个单独的查询,并将结果与
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;  

我建议
交叉应用

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

我建议
交叉应用

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

使用
APPLY
unpivot
。e、 g.
从myTable中选择T.Name、C.Score作为T交叉应用(值(T.Score1)、(T.Score2))作为C(Score),其中C.Score不为空
在一个不相关的注释中,查看一些设置帖子格式的提示和工具。@ZLK我不知道您可以交叉应用原始表中的值。谢谢你今天教我一些简洁的东西。使用
APPLY
UNPIVOT
。e、 g.
从myTable中选择T.Name、C.Score作为T交叉应用(值(T.Score1)、(T.Score2))作为C(Score),其中C.Score不为空
在一个不相关的注释中,查看一些设置帖子格式的提示和工具。@ZLK我不知道您可以交叉应用原始表中的值。谢谢你今天教我一些整洁的东西。