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

これをピボットする必要があると思いますが、試行するたびに構文エラーが発生するだけで、ピボット構文をまだ完全には理解していません。

4

1 に答える 1

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 ('+@columns+')) p'

exec sp_executesql @sql
于 2012-10-17T22:02:44.417 に答える