Sql server 带总和的不同行
我有一张费用表Sql server 带总和的不同行,sql-server,tsql,Sql Server,Tsql,我有一张费用表 DECLARE @EXPENSE TABLE ( ID INT, CURRENCY NVARCHAR(4), AMOUNT MONEY ) INSERT INTO @EXPENSE VALUES (1,'USD',100), (2,'USD',10), (1,'USD',80), (2,'USD',5), (1,'EUR',80), (1,'EUR',30), (3,'USD',20) 数据如下: +----+----------+--------
DECLARE @EXPENSE TABLE
(
ID INT,
CURRENCY NVARCHAR(4),
AMOUNT MONEY
)
INSERT INTO @EXPENSE VALUES
(1,'USD',100),
(2,'USD',10),
(1,'USD',80),
(2,'USD',5),
(1,'EUR',80),
(1,'EUR',30),
(3,'USD',20)
数据如下:
+----+----------+--------+
| ID | CURRENCY | AMOUNT |
+----+----------+--------+
| 1 | USD | 100 |
+----+----------+--------+
| 2 | USD | 10 |
+----+----------+--------+
| 1 | USD | 80 |
+----+----------+--------+
| 2 | USD | 5 |
+----+----------+--------+
| 1 | EUR | 80 |
+----+----------+--------+
| 1 | EUR | 30 |
+----+----------+--------+
| 3 | USD | 20 |
+----+----------+--------+
我希望得到这样的结果
+----+----------+--------+
| ID | CURRENCY | AMOUNT |
+----+----------+--------+
| 1 | EUR | 110 |
+----+----------+--------+
| 1 | USD | 180 |
+----+----------+--------+
| 2 | USD | 15 |
+----+----------+--------+
| 2 | EUR | 0 |
+----+----------+--------+
| 3 | USD | 20 |
+----+----------+--------+
| 3 | EUR | 0 |
+----+----------+--------+
我写了以下内容:
SELECT E.ID, E.CURRENCY, SUM(E.AMOUNT) AS AMOUNT
FROM @EXPENSE AS E
GROUP BY E.ID, E.CURRENCY
但它并没有给我缺少的货币和零金额
有人能帮忙吗?您需要将不同ID和不同货币进行
交叉连接,然后将左连接到表中进行聚合:
SELECT i.ID, c.CURRENCY,
COALESCE(SUM(AMOUNT), 0) TOTAL
FROM (SELECT DISTINCT ID FROM @EXPENSE) i
CROSS JOIN (SELECT DISTINCT CURRENCY FROM @EXPENSE) c
LEFT JOIN @EXPENSE e ON e.ID = i.ID AND e.CURRENCY = c.CURRENCY
GROUP BY i.ID, c.CURRENCY
ORDER BY i.ID, c.CURRENCY
请参阅。
结果:
我认为您的描述中缺少的是,您还希望维护货币类型和金额的占位符。因此,始终会有两种货币类型(美元、欧元),但它们不一定总是有金额,在这种情况下,您希望它默认为0。这准确吗?
> ID | CURRENCY | TOTAL
> -: | :------- | -------:
> 1 | EUR | 110
> 1 | USD | 180
> 2 | EUR | 0
> 2 | USD | 15
> 3 | EUR | 0
> 3 | USD | 20