0

このクエリは必要なものを正確に返しますが、それからピボットテーブルを作成しようとしています。CASE句でSLAStatusとして定義されている列をSUMできるようにし(それが可能かどうかはわかりません)、OrderID列をカウントし、calculate(SLAStatus列の合計)/(OrderID列のカウント)を返します。 SLAを伴う注文の割合。どこでもオンラインで探していましたが、これを理解できないようです

SELECT oi.OrderID, o.Address1 as StreetAddress, c.Name as County, o.State,                         p.Abbreviation, oi.OrderDate as Dateentered, 
DATEADD(dd, DATEDIFF(dd, 0, oi.DeliveredDate), 0) as DateCompleted, DATEADD(dd,                  DATEDIFF(dd, 0, oi.RequiredByDate), 0) as EstimatedDeliveryDate, 

     CASE
WHEN oi.DeliveredDate <= oi.RequiredByDate THEN '1'
ELSE '0'
END AS SLAStatus,

cl.Name as Client, clb.Name as Client2,  v.ContactFirstName + ' ' + v.ContactLastName      as Appraiser

FROM OrderItems oi
JOIN Orders o on o.OrderID = oi.OrderID
JOIN Counties c on c.FIPS = o.FIPS
JOIN Products p on p.ProductID = oi.ProductID
JOIN Clients cl on cl.ClientID = o.ClientID
JOIN ClientBranches clb on clb.ClientID = cl.ClientID
JOIN Vendors v on v.VendorID = oi.VendorID
JOIN Milestones m on m.MilestoneID = oi.LastMilestoneID


WHERE cl.Name not like '%TEST%'
and '2012-03-01' <=
        (select MAX(MilestoneDate)
            from OrderItemMilestones
            where OrderID = oi.OrderID
                and OrderItemID = oi.OrderItemID
                and MilestoneID in (100,130,140,150))

and '2012-04-10' >=
        (select MAX(MilestoneDate)
            from OrderItemMilestones
            where OrderID = oi.OrderID
                and OrderItemID = oi.OrderItemID
                and MilestoneID in (100,130,140,150))
4

1 に答える 1

0

共通テーブル式(CTE)を使用することをお勧めします。元のクエリをCTEでラップするだけで、探しているグループ化を行うことができます。

with originalCTE as
(
    SELECT oi.OrderID, o.Address1 as StreetAddress, c.Name as County, o.State,    
                         p.Abbreviation, oi.OrderDate as Dateentered, 
    DATEADD(dd, DATEDIFF(dd, 0, oi.DeliveredDate), 0) as DateCompleted, DATEADD(dd, 
                     DATEDIFF(dd, 0, oi.RequiredByDate), 0) as EstimatedDeliveryDate, 

         CASE
    WHEN oi.DeliveredDate <= oi.RequiredByDate THEN '1'
    ELSE '0'
    END AS SLAStatus,

    cl.Name as Client, clb.Name as Client2,  v.ContactFirstName + ' ' + v.ContactLastName      as Appraiser

    FROM OrderItems oi
    JOIN Orders o on o.OrderID = oi.OrderID
    JOIN Counties c on c.FIPS = o.FIPS
    JOIN Products p on p.ProductID = oi.ProductID
    JOIN Clients cl on cl.ClientID = o.ClientID
    JOIN ClientBranches clb on clb.ClientID = cl.ClientID
    JOIN Vendors v on v.VendorID = oi.VendorID
    JOIN Milestones m on m.MilestoneID = oi.LastMilestoneID


    WHERE cl.Name not like '%TEST%'
    and '2012-03-01' <=
            (select MAX(MilestoneDate)
                from OrderItemMilestones
                where OrderID = oi.OrderID
                    and OrderItemID = oi.OrderItemID
                    and MilestoneID in (100,130,140,150))

    and '2012-04-10' >=
            (select MAX(MilestoneDate)
                from OrderItemMilestones
                where OrderID = oi.OrderID
                    and OrderItemID = oi.OrderItemID
                    and MilestoneID in (100,130,140,150))

)
select sum(SLAStatus), sum(SLAStatus) / count(orderID)
from originalCTE;

私があなたが探しているものを正しく理解しているなら、それは私がそれをする方法です。お役に立てれば。

于 2012-04-10T00:55:53.923 に答える