【发布时间】:2018-05-03 05:33:37
【问题描述】:
我有一个执行联合操作的查询。这是查询
SELECT R.ThanaID, R.RoadTypeId, Count(R.Id) AS NoRdExist, 0 AS NoRdImp, 0 AS
BcLenExist, 0 AS BcLenImp FROM RoadInventory AS R
INNER JOIN Thana AS A ON R.ThanaID = A.Id GROUP BY R.ThanaID,R.RoadTypeId
UNION SELECT R.ThanaID, R.RoadTypeId, 0 AS NoRdExist, Count(R.Id) AS
NoRdImp,0 AS BcLenExist, 0 AS BcLenImp FROM RoadInventory_Temp AS R
INNER JOIN Thana AS A ON R.ThanaID = A.Id GROUP BY R.ThanaID, R.RoadTypeId
UNION SELECT R.ThanaID, RI.RoadTypeId, 0 AS NoRdExist, 0 AS NoRdImp,
Sum(CASE WHEN(R.SurfaceType='BC') THEN ((R.ToChain-R.FromChain)/1000) END)
AS BcLenExist, 0 AS BcLenImp
FROM (RoadInventory AS RI
INNER JOIN Thana AS A ON RI.ThanaID = A.Id)
INNER JOIN Segment AS R ON (RI.Id = R.RoadID) AND (RI.ThanaID = R.ThanaID) GROUP BY R.ThanaID, RI.RoadTypeId
UNION SELECT R.ThanaID, RI.RoadTypeId, 0 AS NoRdExist, 0 AS NoRdImp, 0 AS
BcLenExist, Sum(CASE WHEN(R.SurfaceType='BC') THEN ((R.ToChain-R.FromChain)/1000) END)
AS BcLenImp
FROM (RoadInventory_Temp AS RI
INNER JOIN Thana AS A ON RI.ThanaID = A.Id)
INNER JOIN Segment_Temp AS R ON (RI.Id = R.RoadID) AND (RI.ThanaID = R.ThanaID) GROUP BY R.ThanaID, RI.RoadTypeId
结果是这样的
ThanaID |RoadTypeId |NoRdExist |NoRdImp |BcLenExist |BcLenImp |
...............................................................
10101 |2 |0 |0 |0 |92
...............................................................
10101 |2 |0 |0 |92 |0
...............................................................
10101 |2 |0 |8 |0 |0
...............................................................
10101 |2 |8 |0 |0 |0
...............................................................
10101 |3 |0 |0 |0 |42
...............................................................
10101 |3 |0 |0 |42 |0
...............................................................
10101 |3 |0 |26 |0 |0
...............................................................
10101 |3 |26 |0 |0 |0
...............................................................
现在我想将包含 0(零)的列合并到包含值的列中。像这样
ThanaID |RoadTypeId |NoRdExist |NoRdImp |BcLenExist |BcLenImp |
...............................................................
10101 |2 |8 |8 |92 |92
...............................................................
10101 |3 |26 |26 |42 |42
...............................................................
我怎样才能挤压这些行?
【问题讨论】:
-
我不知道您的架构,但快速查看查询表明不需要联合。您也许可以在具有多个连接的单个查询中实现这一点。如果没有,请将此联合与另一个在所需列上使用 sum 函数的 select 包装起来。
-
简单地说,将当前查询包装为 CTE,然后通过
ThanaID聚合,获取所有列的总和。或者,按照@danish 的建议,尝试编写一个查询来处理所有事情。 -
旁注:为什么
UNION而不是简单的UNION ALL?我不认为有任何重复要删除,是吗?那你为什么一直加入Thana表?你没有使用它。
标签: sql sql-server union