14

Tôi có truy vấn sau đây:SQL bằng dấu phẩy liên tiếp với Nhóm By khoản

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

Điều này tất nhiên ném một ngoại lệ vì luật không phải là trong mệnh đề group by. Mỗi state_fee có một mã. Làm cách nào để tôi nhận được mã này để hiển thị trong 1 bản ghi (1 mã trên mỗi trạng thái_fee là nhiều state_fee trên mỗi đơn vị) dưới dạng danh sách được phân cách bằng dấu phẩy? Tôi nhìn vào các giải pháp khác nhau ở đây nhưng tôi không thể tìm thấy bất kỳ giải pháp nào đã làm việc với một group by.

Trả lời

23

Bạn muốn sử dụng FOR XML PATH xây dựng:

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 

Xem ví dụ khác tại đây:

0

Không có tích hợp chức năng tổng hợp để ghép, nhưng bài viết này thảo luận về một số giải pháp thay thế, trong đó có một chức năng tổng hợp người dùng định nghĩa nối:

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

+0

Trước tiên tôi nghĩ projectdms chỉ đơn giản là cạo bài viết gốc w/o ghi công, nhưng thực sự trang web thuộc về tác giả bài viết –

+0

Liên kết đã chết. Đây là một thay thế: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/ – gpinkas

0

này sẽ cho bạn thấy bảng, tên chỉ mục, loại chỉ số, cột lập chỉ mục, và bao gồm các cột:

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 
Các vấn đề liên quan