2012-10-17 75 views
0

我有一个查询,我试图写回来的数量和实例发生在一个数据库和按星期和数据库定义的产品组的数量。下面是我的查询:枢纽总数每周

SELECT WeekCompleted, Product, COUNT(OrderNumber) as CorrectionCount FROM(
SELECT 
p.Abbreviation as Product 
,CAST(oi.OrderID as VARCHAR(MAX))+'.'+CAST(oi.OrderItemID as VARCHAR(MAX)) AS OrderNumber 
,CASE 
    WHEN o.ClientID IN (56156, 56394) 
     THEN DATEADD(week, datepart(ww, dbo.GetLatestMilestoneDate(oi.OrderID, oi.OrderItemID, 80)) 
      - 1, DATEADD(DAY, @@datefirst - DATEPART(weekday, CAST(YEAR(GETDATE()) AS VARCHAR) 
      + '-01-01') - 6, CAST(YEAR(GETDATE()) AS VARCHAR) + '-01-01')) 
    ELSE DATEADD(week, datepart(ww, dbo.GetLatestMilestoneDate(oi.OrderID, oi.OrderItemID, 130)) 
    - 1, DATEADD(DAY, @@datefirst - DATEPART(weekday, CAST(YEAR(GETDATE()) AS VARCHAR) 
    + '-01-01') - 6, CAST(YEAR(GETDATE()) AS VARCHAR) + '-01-01')) 
    END AS WeekCompleted 
,CASE 
    WHEN o.ClientID IN (56156,56394) THEN dbo.GetLatestMilestoneDate(oi.OrderID, oi.OrderItemID, 80) 
    ELSE dbo.GetLatestMilestoneDate(oi.OrderID, oi.OrderItemID, 130) END AS LastCompleted 
FROM 
OrderItems oi 
LEFT JOIN OrderItemMilestones oim on oim.OrderID = oi.OrderID and oim.OrderItemID = oi.OrderItemID 
JOIN Products p on p.ProductID = oi.ProductID 
JOIN Orders o on o.OrderID = oi.OrderID 
WHERE 
oim.MilestoneID = 90 
and QueueID = 0 
) src 
WHERE LastCompleted >= '2012-10-01' 
GROUP BY WeekCompleted, Product 

这里是需要

dbo.getlatestmilestonedate() returns a datetime date in this format: mm:dd:yyyy hh:mm:ss 

更多的信息和数据的一个示例表我目前有:

WeekCompleted   Product CorrectionCount 
2012-09-30 00:00:00.000 Product1 5 
2012-10-07 00:00:00.000 Product1 7 
2012-10-14 00:00:00.000 Product1 7 
2012-09-30 00:00:00.000 Product2 18 
2012-10-07 00:00:00.000 Product2 28 
2012-10-14 00:00:00.000 Product2 16 

这些数据返回究竟如何我想它以便原始数据不需要改变,除非需要达到最终目标,这是:

WeekCompleted    Product1  Product2 
2012-09-30 00:00:00.000  5    18 
2012-10-07 00:00:00.000  7    28 
2012-10-14 00:00:00.000  7    16 

我想我需要对此进行调整,但每次我尝试我只遇到语法错误,并且还不完全理解枢轴语法。

+0

如果有人需要的东西,我可以填补空白的详细信息 – wondergoat77

+1

你会有两个以上的产品,你想要的列? – Taryn

+0

是的,认为两个是足以得到正确的语法,虽然 – wondergoat77

回答

1

试试这个

select weekcompleted, product1, product2 
from (your query) src 
pivot (sum(CorrectionCount) for Product in ([Product1],[Product2])) p 

如果你的产品可以改变,那么你必须建立在枢轴上面的查询使用动态SQL

declare @columns varchar(4000) 
select @columns = ''; 
select @columns = ',[' + productname +']' 
    from (select distinct productname from products) v 
select @columns = substring (@columns, 2, len(@columns)) 

declare @sql nvarchar(4000) 
select @sql = 'select weekcompleted, ' + @columns 
+ ' from (your query) src ' 
+ ' pivot (sum(CorrectionCount) for Product in ('[email protected]+')) p' 

exec sp_executesql @sql 
+0

谢谢这个伎俩。 – wondergoat77

+0

当我把查询放入(你的查询)即时消息将选择p.abbreviation作为产品放到)src时,我得到一个语法错误。这里是错误消息102,级别15,状态1,行11 附近有语法错误+ CAST(oi.OrderItemID为VARCHAR(MAX))AS ORDERNUMBER \t,CASE \t \t WHEN o.ClientID IN(56156,56394 ) \t \t \t THEN DATEADD(week,datepa'。 – wondergoat77

+0

@ wondergoat77您需要将查询中的任何引号加倍 - 即:用'''替换'''(两个单引号,而不是双引号) 。或者你可以把你的查询放到一个视图中,如果它的静态。 – podiluska