4

私はテーブルを持っています

Create table Country_State_Mapping
(
    Country nvarchar(max),
    State nvarchar(max)
)

5枚のレコード付き。

Insert into Country_State_Mapping values('INDIA', 'Maharastra')
Insert into Country_State_Mapping values('INDIA', 'Bengal')
Insert into Country_State_Mapping values('INDIA', 'Karnatak')
Insert into Country_State_Mapping values('USA', 'Alaska')
Insert into Country_State_Mapping values('USA', 'California')

以下のように、2 レコード/2 列を提供する SQL クエリを作成する必要があります。

1 列目はContry、2列目は AllStates

1レコード(2列)となります

インドとマハラストラ、ベンガル、カルナタック

2位

アメリカとアラスカ、カリフォルニア

やってみた これ好き

select distinct
    OutTable.Country,
    (select State
     from Country_State_Mapping InnerTable
     where InnerTable.Country = OutTable.Country)
from Country_State_Mapping AS OutTable

しかし、うまくいきませんでした...

4

2 に答える 2

13
SELECT Country, AllStates = 
    STUFF((SELECT ', ' + State
           FROM Country_State_Mapping b 
           WHERE b.Country = a.Country
           FOR XML PATH('')), 1, 2, '')
FROM Country_State_Mapping a
GROUP BY Country
于 2012-07-03T13:01:21.057 に答える
1

Country_State_Mapping テーブル内のレコード数が多い場合、これは少し面倒で遅くなる可能性がありますが、仕事は完了します。SQL 2005 で導入された Common Table Expressions の再帰機能を使用します。

;WITH Base
AS
(
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY Country ORDER BY Country, [State] DESC) AS CountryRowId,
        ROW_NUMBER() OVER (ORDER BY Country, [State]) AS RowId,
        Country,
        [State]
    FROM Country_State_Mapping
),
Recur
AS
(
    SELECT
        CountryRowId,
        RowId,
        Country,
        [State]
    FROM Base
    WHERE RowId = 1

    UNION ALL

    SELECT
        B.CountryRowId,
        B.RowId,
        B.Country,
        CASE WHEN R.Country <> B.Country THEN B.[State] ELSE R.[State] + ',' + B.[State] END
    FROM Recur R
    INNER JOIN Base B
        ON R.RowId + 1 = B.RowId
)

SELECT *
FROM Recur
WHERE CountryRowId = 1
OPTION (MAXRECURSION 0)--Dangerous
于 2012-07-03T13:21:31.967 に答える