需要帮助修复查询SQL Server

时间:2015-04-23 09:21:42

标签: sql sql-server-2000

目前,我在将表格导出到我创建的新表格时面临问题,该表格具有不同的结构。

我有这样的表A:

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

知道如何使用查询来实现结果吗?任何帮助都将非常感激。

谢谢你们。

2 个答案:

答案 0 :(得分: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)

*已编辑包含第二栏

答案 1 :(得分: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

这里我假设您的输出需要您的数据中的某个订单。如果你真的不需要它 - 那么就扔掉它并仅使用内部选择