sql >> データベース >  >> RDS >> Sqlserver

SQL Server で group_concat を実行したい

    結合 (この場合は自己結合ですが、すべての結合が機能します) と、これに STUFF を使用する例を示します。 STUFF 内の WHERE 句に注意してください。これにより、レコードが正しい値にリンクされます。

    declare @test table(email varchar(50),address varchar(50))insert into @test VALUES('[email protected]
     ','A123A'), ('[email protected]
     ','AB263'), ('[email protected]
     ','45632A'), ('[email protected]
     ','78YU'),('[email protected]
     ','6543D')SELECT DISTINCT email, Stuff((SELECT ', ' + address FROM @test t2 WHERE t2.email =t1.email FOR XML PATH('')), 1, 2, '') AddressFROM @test t1   

    編集

    では、あなたが望むもの (あなたが本当に本当に欲しいもの) は:

    declare @customers table(emailaddress varchar(50),customerid int)insert into @customers VALUES('[email protected]
     ',1), ('[email protected]
     ',2) @orders テーブル (orderid int,customerid int,orderdate date) を宣言 @orders に挿入 VALUES(1, 1, '2017-06-02'),(2, 1, '2017-06-05') ,(3, 1, '2017-07-13'),(4, 2, '2017-06-13')declare @orderdetails table(id int,orderid int,productcode varchar(10))insert into @orderdetails VALUES (1, 1, 'アップルパイ'),(2, 1, 'パン'),(3, 2, 'カスタード'),(4, 2, 'オレンジ'),(5, 3, 'オレンジ') ,(6, 4, 'orange')SELECT DISTINCT c.EmailAddress, productcode=STUFF((SELECT ',' + odc.productcode FROM (SELECT DISTINCT emailaddress,productcode FROM @orders o2 内部結合 @orderdetails od2 ono2.orderid =od2 .orderidinner join @customers c2 ON c2.customerid =o2.customerid) odc WHERE odc.emailaddress=c.emailaddress FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1 , 1, '')FROM @OrderDetails od JOIN @Orders o ON od.OrderID =o.OrderID JOIN @Customers c ON c.CustomerID=o.CustomerID WHERE o.OrderDate BETWEEN '2016-01-01' AND getdate()   

    ここで変更に注意してください。 STUFF の SELECT はサブクエリからのものになったため、EmailAddress でグループ化できます。

    追加説明

    目的は、顧客 (電子メール アドレスで表される) ごとにグループ化された製品コードを連結することです。問題は、製品コードが orderdetails テーブルにあり、emailaddress が customer テーブルにあるということですが、この 2 つをリンクするフィールドがありません。 customer テーブルは orders テーブルと 1 対多の関係にあり、orders テーブルは orderdetails テーブルと 1 対多の関係にあります。これは、1 レベルの抽象化が多すぎます。そのため、製品コードと電子メールアドレスの間の直接リンクを提供して、データベースを支援する必要があります。これは、サブクエリを介して行います。これがあなたにとってより明確になることを願っています。




    1. asp.net / MySQL:ユーザー'' @'localhost'のアクセスが拒否されました(パスワードを使用:NO)

    2. 挿入トリガー後の変更エラー

    3. 入力をサニタイズしますが、出力が期待どおりではありません

    4. pg-promiseを使用して特定のpostgresqlクエリをログに記録する