web-dev-qa-db-ja.com

SQL Server:複数の行を1つの行に結合

このようなSQLクエリがあります。

SELECT * 
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602

そして、それが結果です。

enter image description here

私が欲しいのは1つの行(セル)にすべてのSTRINGVALUEを組み合わせて表示し、コンマで区切ります。このような;

SELECT --some process with STRINGVALUE--
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602

Araç Listesi (C2, K1 vb.Belgeler; yoksa Ruhsat Fotokopileri), Min. 5
araç plakası için İnternet Sorgusu, Son 3 Yıla Ait Onaylı Yıl Sonu
Bilanço + Gelir Tablosu, Son Yıl (Yıl Sonuna ait) Detay Mizanı, İçinde
Bulunduğumuz Yıla ait Ara Dönem Geçici Vergi Beyannamesi, Bayi Yorum
E-Maili, Proforma Fatura

どうやってやるの?

58
Soner Gönül

いくつかの方法があります。

統合された文字列値のみを返したい場合、これは迅速かつ簡単なアプローチです

DECLARE @combinedString VARCHAR(MAX)
SELECT @combinedString = COALESCE(@combinedString + ', ', '') + stringvalue
FROM jira.customfieldValue
WHERE customfield = 12534
    AND ISSUE = 19602

SELECT @combinedString as StringValue 

結合された文字列が返されます。

XMLメソッドの1つを試すこともできます。

SELECT DISTINCT Issue, Customfield, StringValues
FROM Jira.customfieldvalue v1
CROSS APPLY ( SELECT StringValues + ',' 
              FROM jira.customfieldvalue v2
              WHERE v2.Customfield = v1.Customfield 
                  AND v2.Issue = v1.issue 
              ORDER BY ID 
                  FOR XML PATH('') )  D ( StringValues )
WHERE customfield = 12534
    AND ISSUE = 19602
76
Code Magician

これを実現するには、For XML PathとSTUFFを次のように組み合わせます。

SELECT (STUFF((
        SELECT ', ' + StringValue
        FROM Jira.customfieldvalue
        WHERE CUSTOMFIELD = 12534
        AND ISSUE = 19602
        FOR XML PATH('')
        ), 1, 2, '')
    ) AS StringValue
16
Karthikeyan P

MySqlには、GROUP_CONCATという便利なメソッドがあります。 SQL Serverに相当するものは存在しませんが、SQLCLRを使用して独自に作成できます。幸いにも someone は既にあなたのためにそれをしました。

クエリは次のようになります(btwはより優れた構文です)。

SELECT CUSTOMFIELD, ISSUE, dbo.GROUP_CONCAT(STRINGVALUE)
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602
GROUP BY CUSTOMFIELD, ISSUE

ただし、この方法は、グループ内の最大100行に適していることに注意してください。それを超えると、大きなパフォーマンスの問題が発生します。 SQLCLR集計は、中間結果をシリアル化する必要があり、非常に多くの作業を迅速に積み上げます。これを覚えておいてください!

興味深いことに、FOR XMLも同じ問題に悩まされることはなく、その恐ろしい構文を使用します。

9
John Leidegren

listagg関数をサポートするデータベースの場合、次のことができます。

select id, issue, customfield, parentkey, listagg(stingvalue, ',') within group (order by id)
from jira.customfieldvalue
where customfield = 12534 and issue = 19602
group by id, issue, customfield, parentkey
1
Liang

MySQLの組み込み関数group_concat()を使用することは、望ましい結果を得るための良い選択です。構文は次のようになります-

SELECT group_concat(STRINGVALUE) 
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602

上記のコマンドを実行する前に、group_concat_max_lenのサイズを増やしてください。そうしないと、出力全体がそのセルに収まらない場合があります。

Group_concat_max_lenの値を設定するには、以下のコマンドを実行します-

SET group_concat_max_len = 50000;

それに応じて値50000を変更できますが、必要に応じて値を大きくしてください。

0
Rito
CREATE VIEW  [dbo].[ret_vwSalariedForReport]
AS
     WITH temp1 AS (SELECT
     salaried.*,
     operationalUnits.Title as OperationalUnitTitle
FROM
    ret_vwSalaried salaried LEFT JOIN
    prs_operationalUnitFeatures operationalUnitFeatures on salaried.[Guid] = operationalUnitFeatures.[FeatureGuid] LEFT JOIN 
    prs_operationalUnits operationalUnits ON operationalUnits.id = operationalUnitFeatures.OperationalUnitID 
    ), 
temp2 AS (SELECT
    t2.*,
    STUFF ((SELECT ' - ' + t1.OperationalUnitTitle
        FROM
            temp1 t1 
        WHERE t1.[ID] = t2.[ID]  
        For XML PATH('')), 2, 2, '') OperationalUnitTitles from temp1 t2) 
SELECT 
    [Guid],
    ID,
    Title,
    PersonnelNo,
    FirstName,
    LastName,
    FullName,
    Active,
    SSN,
    DeathDate,
    SalariedType,
    OperationalUnitTitles
FROM 
    temp2
GROUP BY 
    [Guid],
    ID,
    Title,
    PersonnelNo,
    FirstName,
    LastName,
    FullName,
    Active,
    SSN,
    DeathDate,
    SalariedType,
    OperationalUnitTitles
0
mehrab habibi