7

PHP と MySQL データベースを使用して、Apache で実行するために最初に作成したアプリケーションを移植しています。クエリの 1 つは、 と の MySQL 関数を使用して、Concat_WS最初Group_Concatにいくつかの異なる列を 1 つの文字列に連結し、次にGroup_By句によってグループ化されたすべての項目を連結しました。

例として:

ID    Name    Candy
1     John    M&Ms
1     John    KitKat

クエリ:

Select Group_Concat(Concat_WS('-',Name, Candy) Separator '00--00') as UserCandy
From ExampleTable
Group By ID

結果:

UserCandy
John-M&Ms00--00John-KitKat

現在、PHP 5.4+ を使用して SQL Server 2008 で同じ結果を達成しようとしています。

私が試したこと:

SELECT Stuff(name + ';' + candy, 1, 0, '-----') AS UserCandy 
FROM   test 

問題は、セットアップしたフィドルで確認できます

期待される結果は次のようになります。

-----John;MMs-----John;KitKat

最後に、ミックスに列を追加すると、これはさらに難しくなります。IDが同じである結果(上記のように)をマージしたいと思います。group_concatこれは、グループ化された行を自動的にマージするため、非常にうまく機能します。

4

1 に答える 1

7

これは、2 段階のプロセスを使用して実行できます。

nameまず、共通テーブル式を使用して、 andの最初の連結を実行できますcandy。最初の部分ではクエリを使用します。

;with cte as
(
  select id, name+';'+ candy UserCandy
  from table_test
)
select *
from cte

デモを参照してください。これにより、次の結果が得られます。

| ID |   USERCANDY |
--------------------
|  1 |    John;MMs |
|  1 | John;KitKat |

最初の連結が完了したら、FOR XML PATHandを使用しSTUFFて最終結果を取得できます。

;with cte as
(
  select id, name+';'+ candy UserCandy
  from table_test
)
select distinct c.id,
  STUFF(
         (SELECT '-----' + c2.UserCandy
          FROM cte c2
          where c.id = c2.id
          FOR XML PATH (''))
          , 1, 0, '')  AS UserCandy
from cte c;

SQL Fiddle with Demoを参照してください。これにより、次の結果が得られます。

| ID |                     USERCANDY |
--------------------------------------
|  1 | -----John;MMs-----John;KitKat |
于 2013-06-18T20:28:34.377 に答える