使用SQL中的CROSS JOIN从查询和子查询中减去2个值

时间:2013-11-29 20:35:31

标签: sql join subquery cross-join erwin

我有一个问题,我无法回答。

了解5月到6月期间发票数量和发票产品总数的差异。

这样做的一种方法是使用子查询:一个用于六月,另一个用于五月,并减去两个查询的结果。由于两个子查询中的每一个都将返回一行,您可以(应该)使用 CROSS JOIN ,这不需要“on”子句,因为您从一个表(即子查询)加入“all”行来自另一个的所有行。 要查找特定日期的月份,您可以使用 MONTH 功能。

这是Erwin文件

enter image description here

这是我到目前为止所得到的。我不知道如何在这种情况下使用CROSS JOIN

select COUNT(*) TotalInv, SUM(ILP.ProductCount) TotalInvoicedProducts
from Invoice I, (select Count(distinct ProductId) ProductCount from InvoiceLine) AS ILP 
where MONTH(inv_date) = 5

select COUNT(*) TotalInv, SUM(ILP.ProductCount) TotalInvoicedProducts
from Invoice I, (select Count(distinct ProductId) ProductCount from InvoiceLine) AS ILP 
where MONTH(inv_date) = 6

如果你们能提供帮助那就太棒了。

由于

2 个答案:

答案 0 :(得分:1)

问题陈述建议您使用以下步骤:

  • 构造一个查询,其中一个结果行给出了June的值。
  • 构造一个查询,其中一个结果行提供了May的值。
  • 比较两个查询的结果。

问题在于,在SQL中,第三步并不容易。一种方法是通过交叉连接,产生一个包含来自两个子查询的所有值的行;然后很容易使用SELECT (b - a) ...来获得您正在寻找的差异。这不是完成第三步的唯一方法,但你肯定没有用。

答案 1 :(得分:0)

你不能用子查询做点什么吗?我还没有对此进行过测试,但是下面的内容应该为您提供4列,发票和产品供May和6月使用。

select (

select 'stuff' a, count(*) as june_invoices, sum(products) as products from invoices 
where month = 'june' 
 ) june , (

select 'stuff' a, count(*) as may_invoices, sum(products) as products from invoices 
where month = 'may' 
) may

where june.a = may.a