Mam stół wydatków.

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)

Dane są wyświetlane poniżej:

+----+----------+--------+
| ID | CURRENCY | AMOUNT |
+----+----------+--------+
| 1  | USD      | 100    |
+----+----------+--------+
| 2  | USD      | 10     |
+----+----------+--------+
| 1  | USD      | 80     |
+----+----------+--------+
| 2  | USD      | 5      |
+----+----------+--------+
| 1  | EUR      | 80     |
+----+----------+--------+
| 1  | EUR      | 30     |
+----+----------+--------+
| 3  | USD      | 20     |
+----+----------+--------+

Chciałbym uzyskać taki wynik.

+----+----------+--------+
| ID | CURRENCY | AMOUNT |
+----+----------+--------+
| 1  | EUR      | 110    |
+----+----------+--------+
| 1  | USD      | 180    |
+----+----------+--------+
| 2  | USD      | 15     |
+----+----------+--------+
| 2  | EUR      | 0      |
+----+----------+--------+
| 3  | USD      | 20     |
+----+----------+--------+
| 3  | EUR      | 0      |
+----+----------+--------+

Napisałem co następuje:

SELECT E.ID, E.CURRENCY, SUM(E.AMOUNT) AS AMOUNT
FROM @EXPENSE AS E
GROUP BY E.ID, E.CURRENCY

Ale nie daje mi brakujących walut i zerowych kwot.

Czy ktoś może pomóc?

1
Suresh 27 październik 2020, 21:50

1 odpowiedź

Najlepsza odpowiedź

Potrzebujesz CROSS dołącz do różnych identyfikatorów i wyraźnych walut, a następnie LEFT dołącz do tabeli do agregatu:

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

Zobacz Demo
Wyniki:

> ID | CURRENCY |    TOTAL
> -: | :------- | -------:
>  1 | EUR      |    110
>  1 | USD      |    180
>  2 | EUR      |      0
>  2 | USD      |     15
>  3 | EUR      |      0
>  3 | USD      |     20
1
forpas 27 październik 2020, 19:44