2015-04-23 41 views
2

目前我在將表導出到我創建的具有不同結構的新表時遇到了問題。需要幫助來修復查詢SQL Server

我有這樣的表答:

id curr1 price1 curr2 price2 curr3 price3 
a USD 20  USD 10  USD 8 
b USD 30  USD 13  USD 11 
c USD 10  USD 5  USD 4 

,我需要得到結果如下(對不起,我忘了,包括名字列):

a curr1 USD 20  
a curr2 USD 10 
a curr3 USD 8 
b curr1 USD 30  
b curr2 USD 13 
b curr3 USD 11 
c curr1 USD 10  
c curr2 USD 5 
c curr3 USD 4 

任何想法如何實現結果使用查詢?任何幫助將非常感激。

謝謝你們。

+0

請看看'的UNPIVOT' /可能重複[逆透視數據方案解決?(http://stackoverflow.com/questions/11118049/unpivot-data-scenario-to-solve) – NickyvV

回答

1

事情是這樣的:

select * from 
(
    select id, 'curr1' as field, curr1 as curr, price1 as price 
    from tableA 

    union all 

    select id, 'curr2', curr2, price2 
    from tableA 

    union all 

    select id, 'curr3', curr3, price3 
    from tableA 
) as T 
order by T.id asc, T.field asc 

在這裏,我從你的輸出,你需要在你的數據的一些訂單假設。如果你並不真的需要它 - 然後就扔掉它,僅使用內部選擇

2

最簡單的方法是使用CROSS APPLY

SELECT id, currname, curr, price 
FROM [Table] 
CROSS APPLY 
(
    SELECT 'curr1' currname, curr1, price1 UNION ALL 
    SELECT 'curr2' currname, curr2, price2 UNION ALL 
    SELECT 'curr3' currname, curr3, price3 
) c (currname, curr, price) 

或者你可以UNPIVOT數據:

SELECT id, currname, curr, price 
FROM 
( 
    SELECT id, curr1, price1, curr2, price2, curr3, price3 
    FROM [Table] 
) t 
UNPIVOT 
( 
    curr FOR currname IN (curr1, curr2, curr3) 
) c 
UNPIVOT 
( 
    price FOR pricename IN (price1, price2, price3) 
) p 
WHERE RIGHT(currname,1) = RIGHT(pricename,1) 

*編輯,包括你的第二列

+0

我覺得CROSS APPLY的版本是最實用的 –

+0

我同意,這是最簡單的寫法,最容易理解。 –

+0

我試過交叉應用,但它說錯誤附近應用..(nb:即時通訊使用SQL Server 2000)..它查詢不完整? – kroseva