2017-02-09 134 views
1

获取数据的总和我都在下面,我想使用SQL连接到两个表

SELECT 
    Order_Header.Order_ID, Order_Header.OrderNumber, 
    ISNULL(SUM(SplitValue/CostCentre_CCYRate), 0) AS NetPrice_CCY,Issued_Date 
FROM 
    Order_Header 
LEFT OUTER JOIN 
    Order_CostCentre ON Order_Header.Order_ID = Order_CostCentre.Order_ID 
WHERE 
    Order_CostCentre.CostCentre_ID = 3093 
    AND Order_Header.Issued_Date BETWEEN 'start date' AND 'end date' 
    AND Order_Header.Order_Status IN ('ISSUED', 'PARTIAL', 'RECEIVED', 'CLOSED') 
GROUP BY 
    Order_Header.Order_ID 


SELECT 
    Expense_Header.Expense_ID, Expense_Header.Exp_Number, 
    ISNULL(SUM(SplitValue/CostCentre_CCYRate), 0) AS NetPrice_CCY, 
    Exp_Date 
FROM 
    Expense_Header 
LEFT OUTER JOIN 
    Order_CostCentre ON Expense_Header.CostCentre_ID = Order_CostCentre.CostCentre_ID 
WHERE 
    Order_CostCentre.CostCentre_ID = 3093 
    AND Expense_Header.Exp_Date BETWEEN 'start date' AND 'end date' 
    AND Expense_Header.Exp_Status IN ('ACCOUNTS_REVIEW', 'REIMBURSED') 
GROUP BY 
    Expense_Header.Expense_ID 

结合两个查询我想结合这两者,使得我得到的值的总和,从这两张表仅基于Order_CostCentre.CostCentre_ID。请帮助我进行查询。谢谢。

+0

你想对订单号/费用号码做什么?这些应该如何汇总在一起? –

+0

@TimBiegeleisen实际上所有的记录应该基于Order_CostCentre.CostCentre_ID来总结,所以它的好,如果我只接受订单号,我可以排除开支编号 – sumedha

回答

0

一个选项是UNION将您的两个当前查询放在一个子查询中,然后选择净价的总和,按订单ID分组。请注意,为了可读性甚至性能,我将两个原始查询中的每一个都放入单独的CTE中。

;WITH cte1 AS (
    SELECT t1.Order_ID, 
      t1.OrderNumber, 
      ISNULL(SUM(SplitValue/CostCentre_CCYRate), 0) AS NetPrice_CCY, 
      Issued_Date 
    FROM Order_Header t1 
    LEFT OUTER JOIN Order_CostCentre t2 
     ON t1.Order_ID = t2.Order_ID 
    WHERE t2.CostCentre_ID = 3093 AND 
      t1.Issued_Date BETWEEN 'start date' AND 'end date' AND 
      t1.Order_Status IN ('ISSUED', 'PARTIAL', 'RECEIVED', 'CLOSED') 
    GROUP BY t1.Order_ID 
), 

WITH cte2 AS (
    SELECT t1.Expense_ID, 
      t1.Exp_Number,  
      ISNULL(SUM(SplitValue/CostCentre_CCYRate), 0) AS NetPrice_CCY, 
      Exp_Date 
    FROM Expense_Header t1 
    LEFT OUTER JOIN Order_CostCentre t2 
     ON t1.CostCentre_ID = t2.CostCentre_ID 
    WHERE t2.CostCentre_ID = 3093 AND 
      t1.Exp_Date BETWEEN 'start date' AND 'end date' AND 
      t1.Exp_Status IN ('ACCOUNTS_REVIEW', 'REIMBURSED') 
    GROUP BY t1.Expense_ID 
) 

SELECT t.Order_ID, 
     SUM(t.NetPrice_CCY) AS NetPrice_CCY_Total 
FROM 
(
    SELECT Order_ID, NetPrice_CCY 
    FROM cte1 
    UNION ALL 
    SELECT Expense_ID, NetPrice_CCY 
    FROM cte2 
) t 
GROUP BY t.Order_ID 
+0

我得到这个错误:'关键字附近的语法不正确'。如果此语句是公用表表达式,xmlnamespaces子句或变更跟踪上下文子句,则必须以分号结尾以前的语句。“# – sumedha

+0

@sumedha在两个CTE之间插入一个逗号。 –

+0

我仍然收到该错误 – sumedha

0

这里的query.try可能对您有所帮助。

;with merged_data as (

select Order_ID,NetPrice_CCY from(
SELECT Order_Header.Order_ID,Order_Header.OrderNumber, 
IsNull(Sum(SplitValue/CostCentre_CCYRate), 0) AS NetPrice_CCY,Issued_Date 
FROM Order_Header 
LEFT OUTER JOIN Order_CostCentre ON Order_Header.Order_ID = Order_CostCentre.Order_ID 
WHERE Order_CostCentre.CostCentre_ID = 3093 
AND Order_Header.Issued_Date BETWEEN 'start date' AND 'end date' 
AND Order_Header.Order_Status IN ('ISSUED','PARTIAL','RECEIVED','CLOSED') 
GROUP BY Order_Header.Order_ID 
) as a 

union all 

select Expense_ID as Order_ID ,NetPrice_CCY from (

SELECT Expense_Header.Expense_ID,Expense_Header.Exp_Number, 
IsNull(Sum(SplitValue/CostCentre_CCYRate), 0) AS NetPrice_CCY,Exp_Date 
FROM Expense_Header 
LEFT OUTER JOIN Order_CostCentre ON Expense_Header.CostCentre_ID = Order_CostCentre.CostCentre_ID 
WHERE Order_CostCentre.CostCentre_ID = 3093 
AND Expense_Header.Exp_Date BETWEEN 'start date' AND 'end date' 
AND Expense_Header.Exp_Status IN ('ACCOUNTS_REVIEW','REIMBURSED') 
GROUP BY Expense_Header.Expense_ID 

) as b 
) 
select Order_ID ,sum(NetPrice_CCY) from merged_data 
group by Order_ID