web-dev-qa-db-ja.com

グループ化された文字列集計/ SQL ServerのLISTAGG

これは確かに尋ねられたと思いますが、適切な検索語句を見つけることができません。

次のようなスキーマがあるとします。

| CarMakeID | CarMake
------------------------
|         1 | SuperCars
|         2 | MehCars

| CarMakeID | CarModelID | CarModel
-----------------------------------------
|         1 |          1 | Zoom
|         2 |          1 | Wow
|         3 |          1 | Awesome
|         4 |          2 | Mediocrity
|         5 |          2 | YoureSettling

次のようなデータセットを作成したい:

| CarMakeID | CarMake   | CarModels
---------------------------------------------
|         1 | SuperCars | Zoom, Wow, Awesome
|         2 | MehCars   | Mediocrity, YoureSettling

次のスタイルのクエリで、SQL Serverの文字列の「AGG」の代わりに何をしますか?

SELECT *, 
 (SELECT AGG(CarModel) 
  FROM CarModels model
  WHERE model.CarMakeID = make.CarMakeID
  GROUP BY make.CarMakeID) as CarMakes
FROM CarMakes make
18
Matt Mitchell

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

これはTransact SQLの興味深い問題であり、多くの解決策とかなりの議論があります。特定の各カテゴリの各行から区別される列が「集計」列にリストされている要約結果をどのように作成しますか?データを表示するシンプルで直感的な方法を実現するのは驚くほど困難です。アニスセンはさまざまな方法の概要を説明し、選択した方法について注意を促します...

11
gbn

SQL Server 2017またはSQL Server VNext、Azure SQLデータベースの場合、次のようにString_aggを使用できます。

SELECT  make.CarMakeId, make.CarMake, 
        CarModels = string_agg(model.CarModel, ', ') 
FROM CarModels model
    INNER JOIN CarMakes make 
    ON model.CarMakeId = make.CarMakeId
GROUP BY make.CarMakeId, make.CarMake

出力:

+-----------+-----------+---------------------------+
| CarMakeId |  CarMake  |         CarModels         |
+-----------+-----------+---------------------------+
|         1 | SuperCars | Zoom, Wow, Awesome        |
|         2 | MehCars   | Mediocrity, YoureSettling |
+-----------+-----------+---------------------------+
4