0

私はこのようなテーブルを持っています:

   Item      Name             Name_location   Price

    1      item1_london        london         10
    1      item1_beijing       bejing         10
    2      item2_london        london         20
    2      item2_beijing       bejing         20

基本的に、このテーブルは私がたくさんのアイテムを持っていることを意味しますeach item will have a different name in different location (two locations: london and beijing)

次のようなテーブルを取得できるようにクエリを実行するにはどうすればよいですか。

  Item     london             bejing          Price
    1      item1_london       item1_beijing    10
    2      item2_london       item2_beijing    20

MSSQLServerを使用しています。

編集:2つのテーブルを更新し、別の列を追加します

4

4 に答える 4

4

場所が2つしかない場合はCASE、aggregateでステートメントを使用できます。

骨材を使用したケース

select item,
  max(case when Name_location = 'london' then name end) london,
  max(case when Name_location = 'bejing' then name end) bejing,
  sum(price) price
from yourtable
group by item

SQL FiddlewithDemoを参照してください

また

select item,
  max(case when Name_location = 'london' then name end) london,
  max(case when Name_location = 'bejing' then name end) bejing,
  price
from yourtable
group by item, price

このPIVOT関数を使用するには、静的/動的の2つの方法があります。

静的PIVOT

select item, [london], [bejing], price
from 
(
  select item, name, name_location, price
  from yourtable
) x
pivot
(
  max(name)
  for name_location in ([london], [bejing])
) p

SQL FiddlewithDemoを参照してください

静的PIVOTバージョンは、既知の数の値がある場合はうまく機能しますが、不明な数の場合は、動的SQLを使用できます。

動的ピボット

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

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

set @query = 'SELECT item,' + @cols + ', price from 
             (
                select item, name, name_location, price
                from yourtable
            ) x
            pivot 
            (
                max(name)
                for name_location in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

于 2012-10-26T10:07:27.807 に答える
1

を使ってpivot

select * 
from YourTable src
pivot (max(name) for name_location in ([london], [beijing]) ) p
于 2012-10-26T09:54:23.777 に答える
0
SELECT DISTINCT o.Item, l.itemName as London, b.ItemName as Beijing
FROM myTable o inner join myTable l ON o.item = l.item
INNER JOIN myTable b ON o.item = b.item
WHERE l.location = 'london' AND b.location = 'beijing'

SQLFiddleリンク:http ://sqlfiddle.com/#!3 / 93c2a / 8

于 2012-10-26T09:55:27.663 に答える
0

ここに画像の説明を入力してください

select item,london,beijing
from t1
pivot(max(Name) for Name_location in (london, beijing)) pvt

ここに画像の説明を入力してください

select item,london,beijing,price
from t1
pivot(max(Name) for Name_location in (london, beijing)) pvt
于 2012-10-26T10:02:30.177 に答える