6

表 1 の内容

ID|Name  
1  Mary  
2  John  

表 2 の内容

ID|Color  
1  Red  
2  Blue  
2  Green  
2  Black  

で終わりたいです

ID|Name|Red|Blue|Green|Black  
1  Mary Y   Y  
2  John     Y     Y     Y

助けてくれてありがとう。


回答ありがとうございます。これを複雑にする可能性のある、私がやろうとしていることについての追加情報を追加して、これを再投稿します。誰かがこれを閉じることができますか?

4

5 に答える 5

6

T-SQL を使用する場合は、PIVOT を使用できます ( http://msdn.microsoft.com/en-us/library/ms177410.aspx )

私が使用したクエリは次のとおりです。

declare @tbl_names table(id int, name varchar(100))
declare @tbl_colors table(id int, color varchar(100))

insert into @tbl_names
select 1, 'Mary'
union
select 2, 'John'


insert into @tbl_colors
select 1, 'Red'
union
select 1, 'Blue'
union
select 2, 'Green'
union
select 2, 'Blue'
union
select 2, 'Black'

select name,
        case when [Red] is not null then 'Y' else '' end as Red,
        case when [Blue] is not null then 'Y' else '' end as Blue,
        case when [Green] is not null then 'Y' else '' end as Green,
        case when [Black] is not null then 'Y' else '' end as Black

from
(
select n.id, name, color from @tbl_names n
inner join @tbl_colors c on n.id = c.id
) as subq
pivot 
(
    min(id)
    FOR color IN ([Red], [Blue], [Green], [Black])
) as pvt

そして、ここに出力があります:

John        Y   Y   Y
Mary    Y   Y       
于 2010-03-12T14:52:26.617 に答える
2

I can use a CASE statement with a subquery to input the Y values.

select ID, Name,
  case
    when exists (select * from Colors C where C.ID = N.ID and Color = 'Red') then
      'Y'
    else
      NULL
  end
,
 case
    when exists (select * from Colors C where C.ID = N.ID and Color = 'Blue') then
      'Y'
    else
      NULL
  end
,
 case
    when exists (select * from Colors C where C.ID = N.ID and Color = 'Green') then
      'Y'
    else
      NULL
  end
,
 case
    when exists (select * from Colors C where C.ID = N.ID and Color = 'Black') then
      'Y'
    else
      NULL
  end
from Names N
于 2010-03-12T15:02:26.763 に答える
1

他のコメンテーターが指摘しているように、あなたは人と色をどのように結び付けているかを正確に示していません. リンク テーブル (person_id、color_id) を使用している場合、標準 SQL の一部ではないピボットまたはクロス集計が必要になるため、標準 SQL でこの問題を解決する方法はありません。

色の数が限られており、既知であり、設計時間であるという条件を追加する場合は、色ごとに 1 つの結合を使用し、SQL で CASE または IF 関数を使用して解決策を考え出すことができます。しかし、それはエレガントではありません。さらに、その条件が非常に長く続くとは思えません。

カラー リンク情報を格納する別の方法を思い付くことができれば、必要な出力を生成するためのオプションが増える可能性がありますが、別の格納手法は、データベースのある程度の非正規化を意味し、他の問題を引き起こす可能性があります。

それ以外の場合は、ストアド プロシージャまたはアプリケーション コードでこれを行う必要があります。

于 2010-03-12T15:38:21.577 に答える
1

私はあなたがこのようなもので終わる必要があるだろうと思う:

SELECT  t1.ID, 
        t1.Name, 
        CASE 
            WHEN red.ID IS NULL THEN '' 
            ELSE 'Y' 
        END As Red,
        CASE 
            WHEN blue.ID IS NULL THEN '' 
            ELSE 'Y' 
        END As Blue
FROM    Table1 t1 
    LEFT JOIN   Table2 Red 
        ON t1.ID = Red.ID AND Red.Color = 'Red'
    LEFT JOIN   Table2 Blue
        ON t1.ID = Blue.ID AND Blue.Color = 'Blue'

MS Sql は、MS Access のような PIVOT クエリをサポートしていません。

于 2010-03-12T14:54:29.387 に答える
-1

他のポスターが言ったことに反して; 3 番目のテーブルは必要ないと思います。アプリケーションで色がよく知られている場合、「色」テーブルは必要ありません。

あなたが探しているのは、このような PIVOTです

于 2010-03-12T14:57:22.010 に答える