I have the following query:
我有以下查询:
SELECT
Account,
Unit,
SUM(state_fee),
Code
FROM tblMta
WHERE MTA.Id = '123'
GROUP BY Account,Unit
This of course throws an exception because the Code is not in the group by
clause. Each state_fee has a code. How do I get this code to display in 1 record (1 code per state_fee which is multiple state_fee per unit) as a comma-separated list? I looked into different solutions on here but I couldn't find any that worked with a group by
.
这当然会抛出异常,因为代码不在group by子句中。每个state_fee都有一个代码。如何将此代码显示在一个记录中(每个state_fee有一个代码,每个单元有多个state_fee)作为逗号分隔的列表?我在这里研究了不同的解决方案,但是我找不到任何与团队合作的方案。
3 个解决方案
#1
23
You want to use FOR XML PATH
construct:
您希望将其用于XML路径构造:
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
See other examples here:
看到其他的例子:
- SQL same unit between two tables needs order numbers in 1 cell
- 两个表之间的SQL相同单元需要一个单元格中的订单号
- SQL Query to get aggregated result in comma seperators along with group by column in SQL Server
- SQL查询,以逗号分隔符和SQL Server中的逐列分组来获取聚合结果
#2
0
There is no built-in aggregate function to concatenate, but this article discusses several alternative solutions, including a user-defined concatenate aggregate function:
没有内置的聚合函数来连接,但是本文讨论了几种可选的解决方案,包括用户定义的连接聚合函数:
https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
#3
0
This will show you the table, index name, index type, indexed columns, and included columns:
这将向您显示表、索引名称、索引类型、索引列以及包含的列:
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
#1
23
You want to use FOR XML PATH
construct:
您希望将其用于XML路径构造:
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
See other examples here:
看到其他的例子:
- SQL same unit between two tables needs order numbers in 1 cell
- 两个表之间的SQL相同单元需要一个单元格中的订单号
- SQL Query to get aggregated result in comma seperators along with group by column in SQL Server
- SQL查询,以逗号分隔符和SQL Server中的逐列分组来获取聚合结果
#2
0
There is no built-in aggregate function to concatenate, but this article discusses several alternative solutions, including a user-defined concatenate aggregate function:
没有内置的聚合函数来连接,但是本文讨论了几种可选的解决方案,包括用户定义的连接聚合函数:
https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
#3
0
This will show you the table, index name, index type, indexed columns, and included columns:
这将向您显示表、索引名称、索引类型、索引列以及包含的列:
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