2012-08-29 54 views
0

我知道如何做到这一点,但我创建的查询需要大约1:30运行,并且由于系统限制,我需要优化它以加快速度。我曾使用同一个表的多个连接来做到这一点,但想知道是否有一个更短的查询或更有效的查询我可以使用。将列转换为行

我给出了一个查询的例子,但它确实有大约100列从下面引用的OrderItemFormDateFields表上的行。我创建了专栏,我得到了我需要的结果,但是它的速度很慢。让我知道你是否需要关于表格的更详细的信息。

我想即时通讯基本上寻找一种方式来动态填充而不是列出每列。我已经看到了几种不同的方式与枢轴和案例陈述,但我还没有很好的枢轴,情况似乎会更加低效。谢谢!

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') 

回答

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 
+0

它确实感谢你!我在理解枢轴方面遇到了很多麻烦,但这对我有很大的帮助。为什么你要说MAX(Value)?这些字段应该只有每个订单号的每个字段有一个值,那么这仅仅是语法的一个要求,还是出于某种目的? – wondergoat77

+0

我只是把这与我的100 +行的枢轴,并减少了我的查询时间从1:30 ish到不到一分钟!再次感谢 – wondergoat77

+1

@ wondergoat77枢轴需要一个聚合函数来处理多个值。你可以在那里使用任何聚合函数(sum/max/min ..)。 – Pradeeshnarayan

1

你的一个问题是,你要扫描整个表五倍的fieldname五个不同的值。如果你不是索引那一栏,你最好。

另外你最好索引OrderNumber

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

编辑补充关于索引一些链接:

+0

你能解释你指的是什么意思吗?或者指出我在正确的方向在哪里?不是在寻找你解决我的问题,我真的想在这里学习 – wondergoat77

+0

感谢您的链接,病态的阅读。 – wondergoat77