2017-05-26 16 views
1

ためのクエリは、私は製品と呼ばれるテーブルを持っていた、とSQL Serverの - 奇妙なテーブル

SELECT * FROM products; 

結果の構造体、それが、これは興味深いものです:私は知っている知っている

PRODUCT_1 | PRODUCT_2 | PRODUCT_3 | PRODUCT_4 | PRODUCT_ 5 
$ 10.00 | $ 20.00 | $ 25.00 | $ 30.00 | $ 35.00 

、誰がこのようなテーブルをデザインするのですか? しかし、残念ながら、これは私が持っているものです。私がする必要があるのは、このテーブルをSQL ServerからC#アプリケーションを通じてPostgreSQLにコピーすることです。 PostgreSQLでは、私はこのテーブルのための新たな構造を有しているが、私は、クエリが私にこのような構造与えることができる作ることができる方法を知ってはいけない:

Product | Cost 
-------------------- 
Product_1 | $ 10.00 
Product_2 | $ 20.00 
Product_3 | $ 25.00 
Product_4 | $ 30.00 
Product_5 | $ 35.00 
+0

これは5個の製品に限定されていますか? – maSTAShuFu

答えて

3

Select B.* 
From products A 
Cross Apply (
       values ('PRODUCT_1',[PRODUCT_1]) 
         ,('PRODUCT_2',[PRODUCT_2]) 
         ,('PRODUCT_3',[PRODUCT_3]) 
         ,('PRODUCT_4',[PRODUCT_4]) 
         ,('PRODUCT_5',[PRODUCT_5]) 
      ) B (Product,Cost) 

戻り

Product  Cost 
PRODUCT_1 10.0000 
PRODUCT_2 20.0000 
PRODUCT_3 25.0000 
PRODUCT_4 30.0000 
PRODUCT_5 35.0000 

EDIT - 指定する必要のない動的アプローチの場合F ieldsとフィールド名

Select Product = C.Item 
     ,Cost = C.Value 
From products A 
Cross Apply (Select XMLData=convert(xml,(Select A.* for XML Raw))) B 
Cross Apply (
       Select Item = attr.value('local-name(.)','varchar(100)') 
         ,Value = attr.value('.','varchar(max)') 
       From B.XMLData.nodes('/row') as A(r) 
       Cross Apply A.r.nodes('./@*') AS B(attr) 
       Where attr.value('local-name(.)','varchar(100)') not in ('FieldsTo','Exclude') 
      ) C 
3

あなたは以下のようにアンピボットを使用することができます。

select * from Products 
unpivot(cost for Product in ([Product_1],[Product_2],[Product_3],[Product_4],[Product_5])) p 

ダイナミックなスクリプトの場合:

declare @cols varchar(max) 
declare @query nvarchar(max) 

select @cols = stuff((select ','+QuoteName(Column_Name) from INFORMATION_SCHEMA.COLUMNS where Table_name = 'Products' for xml path('')),1,1,'') 

Set @query = ' select Product, Cost from Products ' 
Set @query += ' unpivot(cost for Product in (' [email protected] + ')) p ' 

Select @query --Uncomment and execute below query if your created script is good 
--exec sp_executesql @query 
+0

プラス1 - 私は2008年に利用可能だったことを否定的ではなかった。 –

+1

それは2008年から利用可能です...私はあなたのSQLクエリのアプローチの大きなファンです...あなたはいつもユニークです..ありがとう –

+0

笑顔のおかげで –

2

はアリサ01​​

select 'Product' as Product, PRODUCT_1 as Cost from products 
union all 
select 'Product_1 ', PRODUCT_1 from products 
union all 
select 'Product_2', Product_2 from products 
union all 
select 'Product_3 ', Product_3 from products 
union all 
select 'Product_4', Product_4 from products 
union all 
select 'Product_5 ', Product_5 from products 
にこの素晴らしく、簡単な感謝を試してみてください

結果:

Product | Cost 
-------------------- 
Product_1 | $ 10.00 
Product_2 | $ 20.00 
Product_3 | $ 25.00 
Product_4 | $ 30.00 
Product_5 | $ 35.00 
関連する問題