我有這樣的事情:
| ID | 姓名 | 總金額 |
|---|---|---|
| 1 | 姓名1 | 10 |
| 2 | 姓名1 | 20 |
| 3 | 姓名1 | 25 |
| 4 | 姓名2 | 5 |
| 5 | 姓名2 | 12 |
并且需要看起來像這樣:
| 身份證 | 姓名 | 總金額 |
|---|---|---|
| 1,2 | 姓名1 | 30 |
| 2,3 | 姓名1 | 45 |
| 1,3 | 姓名1 | 35 |
| 1,2,3 | 姓名1 | 55 |
| 4,5 | 姓名2 | 17 |
我正在使用STRING_AGG但不知道如何在前 3 個 ID 中分隔。
uj5u.com熱心網友回復:
這是一個遞回版本,它可以處理超過 3 個名稱的 id 并回傳所有可能的組合。但正如戴指出的那樣,隨著組合的數量迅速增加,請注意。但是如果你的真實資料就像你的例子(通常每個名字有 2-3 個 id)那么應該沒問題。
值得注意的是,我這樣做是為了好玩。可能您最好只存盤原始資料并在應用程式層執行此類惡作劇。
CREATE TABLE #data
(
id INT,
[name] VARCHAR(10),
totalAmount INT
);
INSERT INTO #data
VALUES
(1, 'name1', 10),
(2, 'name1', 20),
(3, 'name1', 25),
(4, 'name2', 5),
(5, 'name2', 12);
WITH cte (name, ids, maxid, tot) AS
(
SELECT a.name,
CONVERT(VARCHAR(8000), CONVERT(VARCHAR(10), a.id) ',' CONVERT(VARCHAR(10), b.id) ) AS ids,
b.id AS maxid,
a.totalAmount b.totalAmount AS tot
FROM #data a
INNER JOIN #data b ON b.name = a.name AND a.id < b.id
UNION ALL
SELECT cte.name,
CONVERT(VARCHAR(8000), cte.ids ',' CONVERT(VARCHAR(10), a.id)),
a.id AS maxid,
cte.tot a.totalAmount
FROM cte
INNER JOIN #data a ON cte.name = a.name
WHERE a.id > cte.maxid
)
SELECT ids, name, tot
FROM cte
uj5u.com熱心網友回復:
-- *** Test Data ***
CREATE TABLE #t
(
id int NOT NULL PRIMARY KEY
,[name] nvarchar(30) NOT NULL
,totalAmount money NOT NULL
);
INSERT INTO #t
VALUES (1, 'name1', 10)
,(2, 'name1', 20)
,(3, 'name1', 25)
,(4, 'name2', 5)
,(5, 'name2', 12);
-- *** End Test Data ***
SELECT CAST(T1.id AS varchar(10))
',' CAST(T2.id AS varchar(10)) AS ids
,T1.[name] AS [name]
,T1.totalAmount T2.totalAmount AS totalAmount
FROM #t T1
JOIN #t T2
ON T1.[name] = T2.[name]
WHERE T1.id < T2.id
UNION ALL
SELECT CAST(T1.id AS varchar(10))
',' CAST(T2.id AS varchar(10))
',' CAST(T3.id AS varchar(10)) AS ids
,T1.[name] AS [name]
,T1.totalAmount T2.totalAmount T3.totalAmount AS totalAmount
FROM #t T1
JOIN #t T2
ON T1.[name] = T2.[name]
JOIN #t T3
ON T1.[name] = T3.[name]
WHERE T1.id < T2.id
AND T2.id < T3.id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366949.html
標籤:sql sql-server 查询语句 字符串聚合
