5

sqlserver2008 の SQL ステートメントの作成に問題があります。次のデータがあります。

city     person     priority
-----------------------------------
Linz     Mike       1
Wien     Mike       1   
Linz     Tom        1
Wien     Tom        1
Linz     John       1
Linz     Sarah      2

つまり、マイクトムは優先度 1 でリンツウィーンの都市を選択します。
ジョンは優先度 1 でリンツを選択します。
サラは優先度 2 でリンツを選択します。

今、私は次の出力が欲しいです:

cities          persons          priority
-----------------------------------
Linz, Wien      Mike, Tom       1
Linz            John            1
Linz            Sarah           2

私はすでに次の SQL ステートメントを持っていますが、このクエリはJohnが優先度 1のWienのエントリも持っていることを示しているため、期待した結果が得られません。

SELECT
(SELECT 
  STUFF((SELECT ', ' + d.City 
  FROM (SELECT DISTINCT d2.City FROM dbo.DummyTable d2
        WHERE d2.Priority = d1.Priority) d
  FOR XML PATH('')), 1, 2, '')
  ) 
AS Cities,
(SELECT 
  STUFF((SELECT ', ' + d.Person 
  FROM (SELECT DISTINCT d2.Person FROM dbo.DummyTable d2
        WHERE d2.Priority = d1.Priority) d
  FOR XML PATH('')), 1, 2, '')
  ) 
AS Persons,
d1.Priority
FROM
dbo.DummyTable d1
GROUP BY d1.Priority

このSQL Fiddleも使用できます

このクエリを SQL でどのように記述できるかについてのアイデアはありますか?

4

2 に答える 2

4

これを行う方法は次のとおりです。

;with PersonCityGroupPreferences as (
  select
    Person,
    Priority, 
    stuff ((
      select ', ' + d2.City
      from DummyTable d2
      where d1.Priority = d2.Priority
          and d1.Person = d2.Person
      FOR XML PATH('')
    ), 1, 2, '') Cities
  from DummyTable d1
  group by Person, Priority
)
select 
  Cities,
  stuff ((
    select ', ' + p2.Person
    from PersonCityGroupPreferences p2
    where p1.Cities = p2.Cities
      and p1.Priority = p2.Priority
    FOR XML PATH('')
  ), 1, 2, '') Persons,
  Priority
from PersonCityGroupPreferences p1
group by Priority, Cities

SQLFiddle リンク: http://www.sqlfiddle.com/#!3/d831d/57

最終的な結果を得るために、ソリューションを 2 つのステップに分けました。

  1. Personandでデータをグループ化しPriority、カンマ区切りの都市のリストを 3 番目の列として含む結果セットを取得します。

  2. ポイント 1 を取得した結果セットを取得して同じことを行いますが、列Cities(コンマ区切りリスト) でグループ化し、Priority対応する人物のコンマ区切りリストを生成します。

上記のクエリでは、ステップ 1 は次のクエリです。

select
  Person,
  Priority, 
  stuff ((
    select ', ' + d2.City
    from DummyTable d2
    where d1.Priority = d2.Priority
    and d1.Person = d2.Person
    FOR XML PATH('')
  ), 1, 2, '') Cities
from DummyTable d1
group by Person, Priority

部分的な結果が SQL でどのように表示されるかを次に示します: http://www.sqlfiddle.com/#!3/d831d/58

次に、最初のクエリをCTEとして公開し、(外側の) クエリ 2 で使用できるようにしました。これは基本的に同じことを行いますが、グループ化基準が異なります。

于 2013-08-26T16:13:09.870 に答える