1

と という名前の 2 つのテーブルがPRODUCTあります。DETAIL

TABLE: PRODUCT
slno  product
1          x    
2          y
3          z

TABLE: DETAIL
product    detail
x          good
y          bad
z          worse
x          bad

次のように出力を取得する必要があります

TABLE
X      Y       Z
good   bad     worse
bad
4

4 に答える 4

5

このデータ変換は として知られてPIVOTおり、SQL Server 2005 以降では、データを行から列に変換する機能があります。

列に転置する静的な数の値があるかどうかに応じて、これを行う方法がいくつかあります。それらはすべて、データに a を追加することを伴うrow_number()ため、任意の製品の複数の行を返すことができます。

CASE式で集計関数を使用できます。

select 
  max(case when product = 'x' then detail end) x,
  max(case when product = 'y' then detail end) y,
  max(case when product = 'z' then detail end) z
from
(
  select p.product, d.detail,
    row_number() over(partition by p.product order by p.slno) rn
  from product p
  inner join detail d
    on p.product = d.product
) src
group by rn

デモで SQL Fiddle を参照してください

PIVOT次の関数を使用できます。

select x, y, z
from
(
  select p.product, d.detail,
    row_number() over(partition by p.product order by p.slno) rn
  from product p
  inner join detail d
    on p.product = d.product
) src
pivot
(
  max(detail)
  for product in (x, y, z)
) piv

SQL Fiddle with Demoを参照してください。

列に変換する値 (この場合は製品) の数が不明な場合は、動的 SQL を使用する必要があります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(product) 
                    from product
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
             (
                select p.product, d.detail,
                  row_number() over(partition by p.product order by p.slno) rn
                from product p
                inner join detail d
                  on p.product = d.product
            ) x
            pivot 
            (
                max(detail)
                for product in (' + @cols + ')
            ) p '

execute(@query)

デモで SQL Fiddle を参照してください

すべてのクエリの結果は次のとおりです。

|    X |      Y |      Z |
--------------------------
| good |    bad |  worse |
|  bad | (null) | (null) |
于 2013-02-28T10:56:02.937 に答える
1
This is your query.
    select p.product, d.detail from product p
inner join detail d on  p.product = d.product
于 2013-02-28T10:49:03.970 に答える
0
select d.product, d.detail from detail d
join product p on d.product = p.product
于 2013-02-28T10:39:11.410 に答える
0

SQL Join ステートメントを調べます。この blogpostはそれをうまく説明しています。

于 2013-02-28T10:37:44.277 に答える