Как объединить строки в одну строку в SQL Server - PullRequest
0 голосов
/ 03 мая 2018

У меня есть запрос, который выполняет операцию объединения. Это запрос

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

Как мне сжать эти строки?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Требуется одна строка результатов на 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;

(Я бы, вероятно, написал запрос по-другому, чтобы не получать значения в отдельных строках, но с учетом запроса, приведенного выше, запрос является самым простым решением сейчас.)

0 голосов
/ 03 мая 2018

Вы выполняете разные запросы для ThanaID и RoadTypeId. Затем вы объединяете их через UNION. Непонятно, почему вы это делаете, потому что, кажется, вас не интересует этот 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
...
0 голосов
/ 03 мая 2018

Привет, группа по 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...