14

mam zapytania:SQL oddzielony przecinkami wiersz z grupy klauzuli

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

To oczywiście zgłasza wyjątek gdyż kod nie jest w klauzuli group by. Każdy state_fee ma kod. Jak mogę wyświetlić ten kod w 1 rekordzie (1 kod na stan, który jest wielokrotnym kosztem stanu w jednostce), jako listę rozdzielaną przecinkami? Sprawdziłem różne rozwiązania tutaj, ale nie mogłem znaleźć żadnego, który działałby z group by.

Odpowiedz

23

Chcesz użyć FOR XML PATH konstrukt:

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 

Zobacz inne przykłady tutaj:

0

Nie ma wbudowany jest w zagregowanej funkcji żeby połączyć, ale w tym artykule omówiono kilka alternatywnych rozwiązań, w tym zdefiniowane przez użytkownika złączyć zagregowanej funkcji:

https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

+0

początku myślałem projectdms prostu zgarnia oryginalny artykuł w/o atrybucja, ale w rzeczywistości strona należy do autora artykułu –

+0

Link jest martwy. Oto alternatywa: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/ – gpinkas

0

Spowoduje to wyświetlenie tabeli nazwę indeksu, typ indeksu, indeksowanych kolumn i objęły kolumny:

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