Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 Server_Tsql - Fatal编程技术网

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