在一个SUM案例中组合两个查询

时间:2018-01-29 10:19:00

标签: sql-server-2008-r2

我有两个完全相同分组的查询,但我似乎无法以正确的方式组合它们。

查询1:

SELECT 
    WorkPeriods.Id AS Z_Number,
    CONVERT(VARCHAR, (CONVERT(DATE, WorkPeriods.StartDate, 103)), 103) AS Z_Date,
    SUM(CASE WHEN Payments.Name = 'Cash' THEN Payments.Amount ELSE 0 END) AS Cash_Payments, 
    COUNT(CASE WHEN Payments.Name = 'Cash' THEN 1 END) AS No_of_Tickets_Cash,
    SUM(CASE WHEN Payments.Name = 'Credit Card' THEN Payments.Amount ELSE 0 END) AS Credit_Card_Payments, 
    COUNT(CASE WHEN Payments.Name = 'Credit Card' THEN 1 END) AS No_of_Tickets_Credit_Card
FROM 
    Payments, WorkPeriods
WHERE
    Payments.Date BETWEEN WorkPeriods.StartDate AND WorkPeriods.EndDate 
GROUP BY 
    WorkPeriods.Id, WorkPeriods.StartDate

查询2:

SELECT 
    WorkPeriods.Id AS Z_Number,
    CONVERT(VARCHAR, (CONVERT(DATE, WorkPeriods.StartDate, 103)), 103) AS Z_Date,
    SUM(CASE WHEN Orders.CalculatePrice = 0 THEN Orders.Quantity * Orders.Price ELSE 0 END) AS Gifts_Amount, 
    SUM(CASE WHEN Orders.CalculatePrice = 0 THEN Orders.Quantity ELSE 0 END) AS No_of_Gift_Orders
FROM 
    Orders, WorkPeriods
WHERE 
    Orders.CreatedDateTime BETWEEN WorkPeriods.StartDate AND WorkPeriods.EndDate
GROUP BY 
    WorkPeriods.Id, WorkPeriods.StartDate

有关如何继续的任何建议?我已经尝试使用所有3个表和所有sum-count条件合并它们但是我得到的结果是错误的。我需要所有结果出现在同一行。附件是查询结果

query1

query2

2 个答案:

答案 0 :(得分:0)

您不能只在一个查询中加入所有内容,因为只要您在同一个工作时段获得多个订单或付款,您就会收到错误的值。

您可以将当前查询用作子查询,并将它们完全连接以获取结果。通过使用完全连接,您可以获得仅在一个表而不是另一个表上的任何结果。

Select ISNULL(Pay.Z_Number, Ord.Z_Number) As Z_Number,
  ISNULL(Pay.Z_Date, Ord.Z_Date) as Z_Date,
  Pay.CashPayments,
  Pay.No_of_Tickets_Cash,
  Ord.Gifts_Amount
  --other fields as appropriate
FROM (
    --Query 1 here
    ) AS Pay
  FULL OUTER JOIN (
    --Query 2 here
    ) as Ord ON Pay.Z_Number = Ord.Z_Number and Pay.Z_Date = Ord.Z_Date

另一种方法是创建一个子查询,其中包含来自付款和订单的数据,并将其合并在一起,然后在外部查询中对结果列表求和。

答案 1 :(得分:0)

以下示例查询可能会有所帮助

    SELECT 
MAIN_T.Z_Number
,MAIN_T.Z_Date
,T1.Cash_Payments
,T1.Credit_Card_Payments
,T1.No_of_Tickets_Cash
,T1.No_of_Tickets_Credit_Card
,T2.Gifts_Amount
,T2.No_of_Gift_Orders

FROM
(SELECT DISTINCT
    WorkPeriods.Id AS Z_Number,
    CONVERT(VARCHAR, (CONVERT(DATE, WorkPeriods.StartDate, 103)), 103) AS Z_Date
FROM 
    Payments, WorkPeriods
WHERE
    Payments.Date BETWEEN WorkPeriods.StartDate AND WorkPeriods.EndDate ) MAIN_T

LEFT JOIN

(SELECT 
    WorkPeriods.Id AS Z_Number,
    CONVERT(VARCHAR, (CONVERT(DATE, WorkPeriods.StartDate, 103)), 103) AS Z_Date,
    SUM(CASE WHEN Payments.Name = 'Cash' THEN Payments.Amount ELSE 0 END) AS Cash_Payments, 
    COUNT(CASE WHEN Payments.Name = 'Cash' THEN 1 END) AS No_of_Tickets_Cash,
    SUM(CASE WHEN Payments.Name = 'Credit Card' THEN Payments.Amount ELSE 0 END) AS Credit_Card_Payments, 
    COUNT(CASE WHEN Payments.Name = 'Credit Card' THEN 1 END) AS No_of_Tickets_Credit_Card
FROM 
    Payments, WorkPeriods
WHERE
    Payments.Date BETWEEN WorkPeriods.StartDate AND WorkPeriods.EndDate 
GROUP BY 
    WorkPeriods.Id, WorkPeriods.StartDate) T1
    ON MAIN_T.Z_Number=T1.Z_Number AND MAIN_T.Z_Date=T1.Z_Date

LEFT JOIN
(SELECT 
    WorkPeriods.Id AS Z_Number,
    CONVERT(VARCHAR, (CONVERT(DATE, WorkPeriods.StartDate, 103)), 103) AS Z_Date,
    SUM(CASE WHEN Orders.CalculatePrice = 0 THEN Orders.Quantity * Orders.Price ELSE 0 END) AS Gifts_Amount, 
    SUM(CASE WHEN Orders.CalculatePrice = 0 THEN Orders.Quantity ELSE 0 END) AS No_of_Gift_Orders
FROM 
    Orders, WorkPeriods
WHERE 
    Orders.CreatedDateTime BETWEEN WorkPeriods.StartDate AND WorkPeriods.EndDate
GROUP BY 
    WorkPeriods.Id, WorkPeriods.StartDate) T2
    ON MAIN_T.Z_Number=T2.Z_Number AND MAIN_T.Z_Date=T2.Z_Date