尝试使用相同的"名称"

时间:2018-05-17 08:35:22

标签: sql sql-server-2014

在SQL中,当我们的名字相同时,我试图让两行融合。

现在我有一个SQL查询,如下所示:

SELECT TABLE.Name, SUM(TABLE.Value) AS VALUE1, 0 AS VALUE2
FROM TABLE
WHERE TABLE.Bool = true
GROUP BY TABLE.Name

SELECT TABLE.Name, 0 AS VALUE1, SUM(TABLE.Value)  AS VALUE2
FROM TABLE
WHERE TABLE.Bool = false
GROUP BY TABLE.Name

给我一​​个看起来像这样的结果:

|Name    |Value1    |Value2  |
------------------------------
|Name1   |1000      |0       |
|Name2   |2000      |0       |
|Name3   |3000      |0       |

|Name    |Value1    |Value2  |
------------------------------
|Name1   |0         |0001    |
|Name2   |0         |0002    |
|Name3   |0         |0003    |

使用UNION运算符会产生如下结果:

|Name    |Value1    |Value2  |
------------------------------
|Name1   |1000      |0       |
|Name2   |2000      |0       |
|Name3   |3000      |0       |
|Name1   |0         |0001    |
|Name2   |0         |0002    |
|Name3   |0         |0003    |

我想要获得的结果是这样的:

|Name    |Value1    |Value2  |
------------------------------
|Name1   |1000      |0001    |
|Name2   |2000      |0002    |
|Name3   |3000      |0003    |

注意:

由于表的构建方式,两个选择都可以返回不同的行数。

关于表格构造的一点精确度:

  1. 显示的列Value1和Value 2都来自同一列的同一列,并使用相同的数据集。唯一的区别是有时条件满足而其他时间不满足。
  2. 该表可以有多个具有相同名称的字段,但我们希望每个名称只显示一个结果。
  3. 我无法以任何方式,形状或形式修改表格或其结构,即使我认为结构可以改进很多。
  4. 如果有人知道如何做到这一点,那将会有很大帮助。

1 个答案:

答案 0 :(得分:3)

您可以使用条件聚合

SELECT TABLE.Name, 
       SUM(case when TABLE.Bool = true then TABLE.Value else 0 end) AS VALUE1,
       SUM(case when TABLE.Bool = false then TABLE.Value else 0 end) AS VALUE2
FROM TABLE
GROUP BY TABLE.Name

VALUE1在条件满足时返回Value的总和,而VALUE2为其余记录返回Value的总和。