Строка SQL, разделенная запятыми, с предложением Group By - PullRequest
14 голосов
/ 16 сентября 2011

У меня следующий запрос:

SELECT
  Account,
  Unit,
  SUM(state_fee),
  Code
FROM tblMta
WHERE MTA.Id = '123'
GROUP BY Account,Unit

Это, конечно, вызывает исключение, потому что Код отсутствует в предложении group by.У каждого state_fee есть код.Как получить этот код для отображения в 1 записи (1 код на state_fee, который является кратным state_fee на единицу) в виде списка через запятую?Я искал здесь различные решения, но не смог найти ни одного, который бы работал с group by.

Ответы [ 3 ]

23 голосов
/ 16 сентября 2011

Вы хотите использовать 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 

Смотрите другие примеры здесь:

0 голосов
/ 13 января 2014

Это покажет вам таблицу, имя индекса, тип индекса, индексированные столбцы и включенные столбцы:

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
0 голосов
/ 16 сентября 2011

Нет встроенной функции агрегирования для конкатенации, но в этой статье обсуждается несколько альтернативных решений, включая определяемую пользователем функцию агрегирования:

* ** 1003 тысячи два *https://www.simple -talk.com / SQL / T-SQL-программирование / конкатенация-строка-значения-в-Transact-SQL /
...