两份报告合二为一

时间:2015-03-04 22:18:25

标签: join

我是Oracle和SQL Server的新手,但我创建了两个简单的报告。一个给出了#No; No。订单'每个客户制作的每个客户和另一个提供“#”的报告。收据'每个客户确保每个客户的安全。

这张照片显示的是'没有。订单'报告和收据报告数 http://imgur.com/SJ8xxtn

我希望他们合并显示每个代理人制作和保护的每个客户的订单数量和收据数量。如果没有订单,则显示“没有订单”。如果该代理人没有该客户的收据,则显示“没有收据”。

简单连接不会计算,因为每个代理的订单行数可能不等于每个代理的收据行数。

我希望报告显示如下: http://imgur.com/xKUDCVG

订单数量代码报告:

SELECT
 Name_Of_Agent
,COUNT(Order_Number) NO_OF_ORDERS
,Customer_Name

FROM Orders

WHERE 
    WareHouse_Code = 'W1'
AND trunc(ORD_ENTRY_DATE) between 
    to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 

GROUP BY Name_Of_Agent, Customer_Name

ORDER BY Name_Of_Agent, Customer_Name

收据报告编号:

SELECT
 Name_Of_Agent
,COUNT(RCPT_NUM) NO_OF_RCPTS
,Customer_Name

FROM Receipts

WHERE 
    WareHouse_Code = 'W1'
AND trunc(RCPT_ENTRY_DATE) between 
    to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 

GROUP BY Name_Of_Agent, Customer_Name

ORDER BY Name_Of_Agent, Customer_Name

我可以使用哪些代码将它们连接在一起并打印“无订单”。或者&#39;没有收据&#39;连续?

1 个答案:

答案 0 :(得分:0)

这是一种无法实现的方式。不知道你的表或数据这是否干净,我可以得到它。

我正在做的就是加入你的两个问题,就像你猜测的那样。首先将COUNT_OF_ORDERS子查询加入COUNT_OF_RECEIPTS子查询,该子查询将错过仅存在于COUNT_OF_RECEIPTS中的客户/客户组合,您也注意到了这一点。所以我在几乎相同的查询中联合,但我从COUNT_OF_RECEIPTS加入到COUNT_OF_ORDERS,然后只选择COUNT_OF_ORDERS子查询有NULL的结果。

SELECT
    t1.Name_Of_Agent,
    t1.NO_OF_ORDERS,
    t2.NO_OF_RCPTS,
    Customer_Name
FROM
    (
        SELECT
             Name_Of_Agent
            ,COUNT(Order_Number) NO_OF_ORDERS
            ,Customer_Name
        FROM Orders as 
        WHERE 
            WareHouse_Code = 'W1'
            AND trunc(ORD_ENTRY_DATE) between 
                to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 
        GROUP BY Name_Of_Agent, Customer_Name
    ) T1

    LEFT OUTER JOIN
    (
        SELECT
             Name_Of_Agent
            ,COUNT(RCPT_NUM) NO_OF_RCPTS
            ,Customer_Name
        FROM Receipts
        WHERE 
            WareHouse_Code = 'W1'
            AND trunc(RCPT_ENTRY_DATE) between 
                to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 
        GROUP BY Name_Of_Agent, Customer_Name
    ) t2 ON
        t1.Name_Of_Agent = t2.Name_Of_Agent AND
        t1.Customer_Name = t2.Customer_Name

UNION ALL

SELECT
    t1.Name_Of_Agent,
    t1.NO_OF_ORDERS,
    t2.NO_OF_RCPTS,
    Customer_Name
FROM
    (
        SELECT
             Name_Of_Agent
            ,COUNT(Order_Number) NO_OF_ORDERS
            ,Customer_Name
        FROM Orders as 
        WHERE 
            WareHouse_Code = 'W1'
            AND trunc(ORD_ENTRY_DATE) between 
                to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 
        GROUP BY Name_Of_Agent, Customer_Name
    ) t1

    RIGHT OUTER JOIN
    (
        SELECT
             Name_Of_Agent
            ,COUNT(RCPT_NUM) NO_OF_RCPTS
            ,Customer_Name
        FROM Receipts
        WHERE 
            WareHouse_Code = 'W1'
            AND trunc(RCPT_ENTRY_DATE) between 
                to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 
        GROUP BY Name_Of_Agent, Customer_Name
    ) t2 ON
        t1.Name_Of_Agent = t2.Name_Of_Agent AND
        t1.Customer_Name = t2.Customer_Name
WHERE
    t1.Name_Of_Agent IS NULL

我想要一种更清晰的方法来实现这一点,首先从两个查询中确定不同的AGENT / Customer组合,然后将它们连接回每个表,这不仅应该提供更快的结果,而且还应该是一个更容易理解的SQL声明。当我的大脑重新开始工作时,我会发布信息。

更新:这应该完全等同于上面的查询,但它更漂亮,应该更快。

SELECT
    AG_CU.Name_OF_Agent,
    Count(Orders.Order_Number) as COUNT_OF_ORDERS,
    Count(Receipts.RCPT_NUM) as COUNT_OF_RCPTS,
    AG_CU.Customer_Name
FROM
    (
        /*This will get a list of unique customer/agent combinations in both tables*/
        SELECT
            NAME_OF_AGENT,
            Customer_Name
        FROM
            Orders
        WHERE
            Warehouse_Code = 'W1' AND
            trunc(ORD_ENTRY_DATE) between to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 

        UNION

        SELECT
            NAME_OF_AGENT,
            Customer_Name
        FROM
            Receipts
        WHERE
            Warehouse_Code = 'W1' AND
            trunc(RCPT_ENTRY_DATE) between to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 

    ) AG_CU

    /*Join in Orders*/
    LEFT OUTER JOIN Orders ON
        AG_CU.Name_Of_Agent = Orders.Name_Of_Agent AND
        AG_CU.Customer_Name = Orders.Customer_Name AND
        Warehouse_Code = 'W1' AND
        trunc(Orders.ORD_ENTRY_DATE) between to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 

    /*Join in receipts*/
    LEFT OUTER JOIN Orders ON
        AG_CU.Name_Of_Agent = Receipts.Name_Of_Agent AND
        AG_CU.Customer_Name = Receipts.Customer_Name Warehouse_Code = 'W1' AND
        trunc(Receipts.RCPT_ENTRY_DATE) between to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') 
GROUP BY Name_Of_Agent,Customer_Name