Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 Server中将多行合并为一行_Sql_Sql Server_Union - Fatal编程技术网

如何在SQL Server中将多行合并为一行

如何在SQL Server中将多行合并为一行,sql,sql-server,union,Sql,Sql Server,Union,我有一个执行联合操作的查询。这就是问题所在 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.

我有一个执行联合操作的查询。这就是问题所在

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
...............................................................

如何压缩这些行?

通过ThanaID和RoadTypeID进行Hi分组,然后对字段NoRdExist、NoRdImp、BcLenExist求和 还有b蓝精灵。 试试这个


您希望每个ThanaID和RoadTypeId有一个结果行以及其他值的总和。因此,根据您的查询,您可以简单地聚合:

select thanaid, roadtypeid, sum(nordexist), sum(nordimp), sum(bclenexist), sum(bclenimp)
from ( your query here )
group by thanaid, roadtypeid
order by thanaid, roadtypeid;

(我可能会以不同的方式编写查询,以便不在单独的行中获取值,但使用上面给出的查询,现在查询是最简单的解决方案。)

您正在根据ThanaID和
RoadTypeId运行不同的查询。然后通过
联合
将它们合并。不清楚您为什么要这样做,因为您似乎对
UNION
结果不感兴趣。似乎您想要一个合并的结果。可能是内部连接,可能是所有查询的完全外部连接;我不知道。下面我展示了所有
ThanaID
RoadTypeId
组合的结果,从而避免了完全外部联接,因为在SQL Server中,由于缺少
USING
子句,多个完全外部联接相当笨拙

select
  t.id as thanaid,
  rt.id as roadtypeid,
  q1.nordexist,
  q2.nordimp
from thana t
cross join roadtype rt
left join
(
  select thanaid, roadtypeid, count(*) as nordexist 
  from roadinventory 
  group by thanaid, roadtypeid 
) q1 on q1.thanaid = t.id and q1.roadtypeid = rt.id
left join
(
  select thanaid, roadtypeid, count(*) as nordimp
  from roadinventory_temp 
  group by thanaid, roadtypeid 
) q2 on q2.thanaid = t.id and q2.roadtypeid = rt.id
...

我不知道您的模式,但快速查看一下查询就知道不需要联合。您可能可以在具有多个联接的单个查询中实现这一点。如果没有,则在所需列上使用另一个select with sum函数包装此联合。简单地说,将当前查询包装为CTE,然后通过
ThanaID
聚合,获取所有列的总和。或者,按照@danish的建议,尝试编写一个查询来处理所有问题。旁注:为什么
UNION
而不是简单的
UNION ALL
?我不认为有任何重复的删除,是吗?那你为什么一直在加入
Thana
表呢?你没有用它。谢谢你的建议。你能分享一下你是如何写这个查询的吗?我不能做总和,因为我有一些其他列,其中包含varchart当您的描述和例子是不完整的。它不仅是零,也不是零和它们的和,就像你的例子。对于字符串,您可能只是使用空值来代替零(您也应该将其用于数值),因此您可以只使用
MAX(value
MIN(value)
。总之,我发布了另一个答案,它完全避免了联合中间结果。
select
  t.id as thanaid,
  rt.id as roadtypeid,
  q1.nordexist,
  q2.nordimp
from thana t
cross join roadtype rt
left join
(
  select thanaid, roadtypeid, count(*) as nordexist 
  from roadinventory 
  group by thanaid, roadtypeid 
) q1 on q1.thanaid = t.id and q1.roadtypeid = rt.id
left join
(
  select thanaid, roadtypeid, count(*) as nordimp
  from roadinventory_temp 
  group by thanaid, roadtypeid 
) q2 on q2.thanaid = t.id and q2.roadtypeid = rt.id
...