簡體   English   中英

如何在SQL Server中將行合並為單行

[英]How to merge to rows into a single row in SQL Server

我有一個查詢,它執行聯合操作。 這是查詢

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(零)的列合並到包含value的列中。

ThanaID |RoadTypeId |NoRdExist |NoRdImp |BcLenExist |BcLenImp |
...............................................................
10101   |2          |8         |8       |92         |92
............................................................... 
10101   |3          |26        |26      |42         |42
...............................................................

如何擠壓這些行?

您需要每個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;

(我可能會以不同的方式編寫查詢,以免在單獨的行中獲取值,但是使用上面給出的查詢,現在查詢是最簡單的解決方案。)

您正在每個ThanaIDRoadTypeId運行不同的查詢。 然后,您可以通過UNION組合它們。 目前尚不清楚為什么要這樣做,因為您似乎對該UNION結果不感興趣。 看來您想要一個合並結果。 也許是內部聯接,也許是所有查詢的完全外部聯接; 我不知道 下面,我展示了所有ThanaIDRoadTypeId組合的結果,從而避免了完全外部聯接,因為在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
...

按ThanaID和RoadTypeID分組,然后對字段NoRdExist,NoRdImp,BcLenExist和BcLenImp求和。 嘗試這個

select  ThanaID ,RoadTypeId ,NoRdExist=sum(isnull(NoRdExist,0)),sum(isnull(NoRdImp,0) ) NoRdImp,sum(isnull(BcLenExist,0)  ) as BcLenExist,BcLenImp=sum(isnull(BcLenImp,0)   )  from (
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) as t
        group by ThanaID ,RoadTypeId 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM