将列转换为行

时间:2012-08-29 20:54:56

标签: sql tsql sql-server-2005

我知道如何以一种方式执行此操作,但我创建的查询大约需要1:30才能运行,并且由于系统限制,我需要将其优化为更快。我已使用同一个表的多个连接来执行此操作但是想知道是否有更短的查询或更高效的查询我可以使用。

我已经提供了一个查询示例,但它确实从下面引用的OrderItemFormDateFields表中的行中提取了大约100列。我已经创建了列,我得到了我需要的结果,但同样,它的速度很慢。如果您需要有关表格的更多详细信息,请与我们联系。

我想我基本上都在寻找一种动态填充而不是列出每列的方法。我已经看到了几个不同的方式与枢轴和案例陈述,但我不是很好的枢轴,但案件似乎会更低效。谢谢!

SELECT
OrderNumber
,Product
,OrderDate
,   oifd1.value as  'ADD_SUBJ_ADDRESS'
,   oifd2.value as  'ADD_SUBJ_BATHS'
,   oifd3.value as  'ADD_SUBJ_BEDROOMS'
,   oifd4.value as  'ADD_SUBJ_DATE'
,   oifd5.value as  'ADD_SUBJ_GLA'
FROM(
SELECT CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX))     as      OrderNumber
,p.abbreviation as product, o.orderdate
FROM OrderItems oi
join products p on p.productid = oi.productid
join orders o on o.orderid = oi.orderid)x
left    join    orderitemformdatafields     oifd1   on      oifd1.orderreference    =   OrderNumber and oifd1.fieldname in  (     'SUBJ_STREET_ADDR')
left    join    orderitemformdatafields     oifd2   on      oifd2.orderreference    =   OrderNumber and oifd2.fieldname in  (      'ADD_SUBJ_BATHS')
 left   join    orderitemformdatafields     oifd3   on      oifd3.orderreference    =   OrderNumber and oifd3.fieldname in  (      'ADD_SUBJ_BEDROOMS')
 left   join    orderitemformdatafields     oifd4   on     oifd4.orderreference =   OrderNumber and oifd4.fieldname in  (     'ADD_SUBJ_DATE')
left    join    orderitemformdatafields     oifd5   on      oifd5.orderreference    =   OrderNumber and oifd5.fieldname in  (     'ADD_SUBJ_GLA')

2 个答案:

答案 0 :(得分:1)

您的一个问题是,您为五个不同的fieldname值扫描整个表格五次。如果你没有索引该列,你最好。

另外,您最好在OrderNumber上编制索引。

如果您从程序(例如网页)调用此查询,则可能更容易“转动”该程序中的数据。获取数据,将其写入数组,然后将其作为列而不是行读回。 (假设数据不是很大。)

已编辑添加有关索引的一些链接:

答案 1 :(得分:1)

希望这会对你有所帮助。

select * from (
SELECT CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX))     as      OrderNumber
,p.abbreviation as product, o.orderdate
,oifd.value as value
,oifd.fieldname as fieldname
FROM OrderItems oi
join products p on p.productid = oi.productid
join orders o on o.orderid = oi.orderid
left join orderitemformdatafields     oifd   on  oifd.orderreference = CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX))
) as p
PIVOT
(
    MAX(value) FOR fieldname in ([SUBJ_STREET_ADDR],[ADD_SUBJ_BATHS],[ADD_SUBJ_BEDROOMS],[ADD_SUBJ_DATE],[ADD_SUBJ_GLA])
)AS pvt