2015-11-06 83 views
1

我想我在运行时遇到了一个错误,那就是我如何选择通过语句来聚合我的列。计算CASE语句和GROUP BY子句中的保证金

我工作了保证金%和分组到几个月使用CASE语句,像这样:

SUM(CASE WHEN MONTH(DateProcessed) = 1 AND Revenus <> 0 THEN (Revenue - Cost)/Revenue ELSE 0 END AS [January]

所以我方程最终为:SUM((Revenue - Cost)/Revenue)

,其与多个事务个月给我错误的值

我确定我的等式需要为:SUM(Revenue - Cost)/SUM(Revenue)

但我无法格式化我的case语句。你如何制定出这样的等式?

感谢,

编辑:全面查询

SELECT 
    AR.Code AS [CustomerID] 
    ,MAX(AR.Name) AS [CustomerName] 
    ,MAX(AR.PAddress1) AS [PAddress1] 
    ,MAX(AR.PAddress2) AS [PAddress2] 
    ,MAX(AR.PAddress3) AS [PAddress3] 
    ,MAX(AR.PPostCode) AS [PostCode] 
    ,MAX(CASE 
     WHEN AR.CashAC = 1 
      THEN 'C.O.D' 
     WHEN AR.CashAC = 0 
      THEN 'Trading' 
    END) AS [Account Type (COD/Trading)] 
    ,MAX(AR.Profile) AS [Payment Profile] 
    ,MAX(CASE 
     WHEN AR.Email LIKE '%@%' 
      THEN 'Yes' 
     ELSE 'No' 
    END) AS [Email?] 
    ,MAX(Codes.Description) AS [PriceLevel] 
    ,MAX(CASE 
     WHEN AR.CashAC = 1 
      THEN RefSaleP.Name 
     WHEN AR.CashAC = 0 
      THEN RefAreaC.Description 
    END) AS [Store Assigned] 
    ,MAX(Blackwood.Spend) AS [Blackwood] 
    ,MAX(Distribution.Spend) AS [Distribution] 
    ,MAX(Glenelg.Spend) AS [Glenelg] 
    ,MAX(Millicent.Spend) AS [Millicent] 
    ,MAX(MtBarker.Spend) AS [MtBarker] 
    ,MAX(MtGambier.Spend) AS [MtGambier] 
    ,MAX(MtGambierTruss.Spend) AS [MtGambierTruss] 
    ,MAX(Naracoorte.Spend) AS [Naracoorte] 
    ,MAX(Norwood.Spend) AS [Norwood] 
    ,MAX(ISNULL(Blackwood.Spend,0) + ISNULL(Distribution.Spend,0) + ISNULL(Glenelg.Spend,0) + ISNULL(Millicent.Spend,0) + ISNULL(MtBarker.Spend,0) + ISNULL(MtGambier.Spend,0) + ISNULL(MtGambierTruss.Spend,0) + ISNULL(Naracoorte.Spend,0) + ISNULL(Norwood.Spend,0)) AS [Total] 

    /* Start Revenue Block */ 

    --2012 
    ,SUM(CASE WHEN MONTH(StockTrans.DateProcessed) = 9 AND YEAR(StockTrans.DateProcessed) = 2012 THEN StockTrans.TotalPrice - StockTrans.GST ELSE 0 END) AS [Sep 2012 Revenue] 
    ,......... 
    ,SUM(CASE WHEN MONTH(StockTrans.DateProcessed) = 9 AND YEAR(StockTrans.DateProcessed) = 2015 THEN StockTrans.TotalPrice - StockTrans.GST ELSE 0 END) AS [Sep 2015 Revenue] 

    /*End Revenue Block */ 
    /*Start Cost Block */ 

    --2012 
    ,SUM(CASE WHEN MONTH(StockTrans.DateProcessed) = 9 AND YEAR(StockTrans.DateProcessed) = 2012 THEN StockTrans.QtySupplied * StockTrans.UnitCost ELSE 0 END) AS [Sep 2012 Cost] 
    ,......... 
    ,SUM(CASE WHEN MONTH(StockTrans.DateProcessed) = 9 AND YEAR(StockTrans.DateProcessed) = 2015 THEN StockTrans.QtySupplied * StockTrans.UnitCost ELSE 0 END) AS [Sep 2015 Cost] 

    /*End Cost Block */ 
    /*Start Margin Block */ 

    ,SUM(CASE WHEN MONTH(StockTrans.DateProcessed) = 9 AND YEAR(StockTrans.DateProcessed) = 2012 THEN ((StockTrans.TotalPrice – StockTrans.GST) – (StockTrans.QtySupplied * StockTrans.UnitCost))/(StockTrans.TotalPrice – StockTrans.GST) ELSE 0 END) AS [Sep 2012 Margin] 
    ,......... 
    ,SUM(CASE WHEN MONTH(StockTrans.DateProcessed) = 9 AND YEAR(StockTrans.DateProcessed) = 2015 THEN ((StockTrans.TotalPrice – StockTrans.GST) – (StockTrans.QtySupplied * StockTrans.UnitCost))/(StockTrans.TotalPrice – StockTrans.GST) ELSE 0 END) AS [Sep 2015 Margin] 

    /*End Margin Block*/ 
    /*Start Transactions Block */ 

    --2012 
    ,SUM(CASE WHEN MONTH(StockTrans.DateProcessed) = 9 AND YEAR(StockTrans.DateProcessed) = 2012 AND StockTrans.Sequence = 1 THEN 1 ELSE 0 END) AS [Sep 2012 Trans] 
    ,......... 
    ,SUM(CASE WHEN MONTH(StockTrans.DateProcessed) = 9 AND YEAR(StockTrans.DateProcessed) = 2015 AND StockTrans.Sequence = 1 THEN 1 ELSE 0 END) AS [Sep 2015 Trans] 

    /*End Transactions Block */ 

FROM 
    AR 
    FULL OUTER JOIN Codes ON AR.PriceLevel = Codes.Code 
    FULL OUTER JOIN Codes RefAreaC ON AR.AreaCode = RefAreaC.Code 
    FULL OUTER JOIN PSUser RefSaleP ON AR.SPerson = RefSaleP.Code 
    INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 2 GROUP BY AR.Code) Store1 ON AR.Code = Store1.Code 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 17 GROUP BY AR.Code) Store2 ON AR.Code = Store2.Code 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 19 GROUP BY AR.Code) Store3 ON AR.Code = Store3.Code 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 7 GROUP BY AR.Code) Store4 ON AR.Code = Store4.Code 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 14 GROUP BY AR.Code) Store5 ON AR.Code = Store5.Code 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 6 GROUP BY AR.Code) Store6 ON AR.Code = Store6.Code 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 12 GROUP BY AR.Code) Store7 ON AR.Code = Store7.Code 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 8 GROUP BY AR.Code) Store8 ON AR.Code = Store8.Code 
    FULL OUTER JOIN (SELECT AR.Code, SUM(StockTrans.TotalPrice - StockTrans.GST) AS [Spend] FROM AR INNER JOIN StockTrans ON AR.InternalKey = StockTrans.Account WHERE StockTrans.Type IN ('RCRE','RINV') AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' AND StockTrans.Branch = 9 GROUP BY AR.Code) Store9 ON AR.Code = Store9.Code 

WHERE 
    StockTrans.Type IN ('RINV','RCRE') 
    AND Codes.Type = 'PLVL' 
    AND RefAreaC.Type = 'AREA' 
    AND StockTrans.DateProcessed BETWEEN '2012-09-01 00:00:00.000' AND '2015-10-01 00:00:00.000' 
    AND StockTrans.Branch IN ('2','17','19','7','14','6','12','8','9') 

GROUP BY 
    AR.Code 
+0

请发表您的完整查询。 –

回答

0

您可以使用子查询来获得收入的总和在当前的CASE声明每个月(一月如下图所示)。

SELECT SUM(CASE WHEN MONTH(t1.DateProcessed) = 1 AND t1.Revenue <> 0 
       THEN (t1.Revenue - t1.Cost) 
       ELSE 0 END)/
     (SELECT SUM(t2.revenue) FROM table t2 
     WHERE MONTH(t2.DateProcessed) = 1) AS [January] 
+0

t2.revenueSum不会在group by子句中列出或汇总,我还需要每个时间段都有一个连接正确吗?即:'SELECT SUM(Revenue)AS RevenueSum FROM表WHERE日期2012年9月至2012年10月)tsept2012' – Andrew