2017-05-26 4 views
1

ich einen Tisch hatten Produkte genannt, undSQL Server - Abfrage für eine seltsame Tabelle

SELECT * FROM products; 

Die Struktur des Ergebnisses ist es, was diese interessant macht:

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

Ich weiß, ich weiß, Wer zur Hölle entwerfe so einen Tisch? Aber leider ist das was ich habe. Was ich tun muss, ist diese Tabelle von SQL Server zu PostgreSQL durch eine C# -Anwendung zu kopieren. In PostgreSQL habe ich eine neue Struktur für diese Tabelle, aber ich weiß nicht, wie kann ich eine Abfrage machen mir eine Struktur wie diese geben könnte:

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

ist dies auf 5 Produkte beschränkt? – maSTAShuFu

Antwort

3

Beispiel

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) 

Returns

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

BEARBEITEN - Für einen dynamischen Ansatz, bei dem Sie F nicht angeben müssen ields und Feldnamen

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

können Sie Unpivot verwenden, wie unten:

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

Für dynamische Skript:

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

Plus 1 - Ich war nicht positiv Unpivot war im Jahr 2008 verfügbar. Es ist eine lange Zeit. –

+1

es ist verfügbar von 2008 ... Ich bin großer Fan von Ihren SQL-Abfragen Ansätze ... Ihre sind immer einzigartig .. Danke –

+0

Danke für das Grinsen –

2

testen schön und einfach dank Alisa Move Values from Rows to Columns in SQL Server 2008

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 

Ergebnis:

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