我是Oracle和SQL Server的新手,但我创建了两个简单的报告。一个给出了#No; No。订单'每个客户制作的每个客户和另一个提供“#”的报告。收据'每个客户确保每个客户的安全。
这张照片显示的是'没有。订单'报告和收据报告数
我希望他们合并显示每个代理人制作和保护的每个客户的订单数量和收据数量。如果没有订单,则显示“没有订单”。如果该代理人没有该客户的收据,则显示“没有收据”。
简单连接不会计算,因为每个代理的订单行数可能不等于每个代理的收据行数。
我希望报告显示如下:
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;连续?
答案 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