![](/img/trans.png)
[英]SQL Server - SUM and comma-separated values using GROUP BY clause
[英]SQL comma-separated row with Group By clause
我有以下查詢:
SELECT
Account,
Unit,
SUM(state_fee),
Code
FROM tblMta
WHERE MTA.Id = '123'
GROUP BY Account,Unit
這當然會引發異常,因為 Code 不在group by
子句中。 每個 state_fee 都有一個代碼。 如何讓此代碼顯示在 1 條記錄中(每個 state_fee 1 個代碼,每個單元有多個 state_fee)作為逗號分隔的列表? 我在這里查看了不同的解決方案,但找不到任何與group by
合作的解決方案。
您想使用FOR XML PATH
構造:
SELECT ACCOUNT,
unit,
SUM(state_fee),
Stuff((SELECT ', ' + code
FROM tblmta t2
WHERE t2.ACCOUNT = t1.ACCOUNT
AND t2.unit = t1.unit
AND t2.id = '123'
FOR XML PATH('')), 1, 2, '') [Codes]
FROM tblmta t1
WHERE t1.id = '123'
GROUP BY ACCOUNT,
unit
在此處查看其他示例:
這將顯示表、索引名稱、索引類型、索引列和包含的列:
with [indexes] (table_name, index_name, column_name, index_id, key_ordinal, object_id, type_desc)
as(
SELECT distinct
T.[name] AS [table_name], I.[name] AS [index_name],
AC.[name] AS [column_name],
I.[index_id], IC.[key_ordinal], T.[object_id], i.type_desc
FROM sys.[tables] AS T
INNER JOIN sys.[indexes] I ON T.[object_id] = I.[object_id]
INNER JOIN sys.[index_columns] IC ON I.[object_id] = IC.[object_id] and IC.index_id=I.index_id
LEFT OUTER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id] AND IC.[column_id] = AC.[column_id]
WHERE T.[is_ms_shipped] = 0 AND I.[type_desc] <> 'HEAP'
)
select
distinct
db_name() as dbname,
type_desc,
table_name,
index_name,
column_name,
STUFF((
select ', ' + column_name
from [indexes] t2
where t1.table_name=t2.table_name and t1.[index_name]=t2.[index_name] and t2.[key_ordinal] = 0
for xml path('')), 1, 2, '') inc_cols
from [indexes] t1
where t1.[key_ordinal] = 1
GROUP BY table_name, index_name, type_desc, column_name
在 SQL Server 2017 (14.x) 及更高版本中,您可以使用 STRING_AGG 函數:
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-ver16
SELECT
Account,
Unit,
SUM(state_fee),
STRING_AGG(Code, ',')
FROM tblMta
WHERE MTA.Id = '123'
GROUP BY Account,Unit
根據代碼的數據類型,您可能需要對其進行轉換:
SELECT
Account,
Unit,
SUM(state_fee),
STRING_AGG(CONVERT(NVARCHAR(max), Code), ',')
FROM tblMta
WHERE MTA.Id = '123'
GROUP BY Account,Unit
沒有用於連接的內置聚合函數,但本文討論了幾種替代解決方案,包括用戶定義的連接聚合函數:
https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.