0

我有 2 个要合并在一起的表,我想对这些值求和,而不是让 2 个不同的行具有相同的 ID。这是我目前拥有的:

SELECT
    d.ID,
    SUM(d.balance) AS Balance
FROM  
    d
WHERE 
    d.status != 'closed'
GROUP BY 
    d.ID

UNION ALL

SELECT
    t.ID,
    SUM(t.balance) AS Balance
FROM 
    t
WHERE 
    t.status != 'closed'
GROUP BY 
    t.ID

这给了我一个包含所有 d 值的列表,然后是所有 t 值,我希望任何具有匹配 ID 的行都在一行中

4

2 回答 2

3

在当前查询周围放置一个外部查询并再次分组,如下所示:

select id, sum(Balance)
from (
  SELECT d.ID, SUM(d.balance) AS Balance
  FROM d
  WHERE d.[status] != 'closed'
  GROUP BY d.ID

  UNION ALL

  SELECT t.ID, SUM(t.balance) AS Balance
  FROM t
  WHERE t.[status] != 'closed'
  GROUP BY t.ID
) X
group by id

实际上并不真正需要 innergroup by的,所以以下应该仍然有效并且更清晰:

select id, sum(Balance)
from (
  SELECT d.ID, d.balance
  FROM d
  WHERE d.[status] != 'closed'

  UNION ALL

  SELECT t.ID, t.balance
  FROM t
  WHERE t.[status] != 'closed'
) X
group by id
于 2019-01-23T21:11:16.247 回答
-1

希望对你有帮助

  DECLARE @DataSource TABLE
(
    [id] INT
   ,[Balance] Float
   ,status Varchar(50)

);

INSERT INTO @DataSource ([ID], [Balance],[Status])
VALUES (1, 100 ,'Closed')
      ,(2, 200,'Open' )
      ,(3, 300 ,'Onhold')
      ,(4, 400 ,'Open')


DECLARE @DataSource1 TABLE
(
   [id] INT
   ,[Balance] Float
  ,status Varchar(50)

);


INSERT INTO @DataSource1 ([ID], [Balance],[Status])
VALUES (1, 3 ,'Open')
      ,(2, 3 ,'Open')
      ,(3, 55 ,'Onhold')
      ,(4, 6 ,'Closed')


      SELECT d.ID,sum((Case When d.status!='Closed' Then d.Balance Else 0 End )+(Case When t.status!='Closed' Then t.Balance Else 0 End))
      FROM @DataSource d
     inner Join  @DataSource1 t
     on t.ID= d.ID
     Group By  d.ID,  t.ID


enter code here
于 2019-01-23T21:23:03.997 回答