【问题标题】:Subtracting 2 values from a query and sub-query using CROSS JOIN in SQL在 SQL 中使用 CROSS JOIN 从查询和子查询中减去 2 个值
【发布时间】:2013-12-16 01:52:54
【问题描述】:

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

找出 5 月和 6 月之间发票数量和发票产品总数的差异。

一种方法是使用子查询:一个用于六月,另一个用于五月,然后将两个查询的结果相减。由于两个子查询中的每一个都将返回一行,因此您可以(应该)使用 CROSS JOIN,它不需要“on”子句,因为您连接了一个表中的“所有”行(即子查询)到另一行的所有行。 要查找某个日期的月份,您可以使用 MONTH 功能。

这是欧文文档

这是我到目前为止所得到的。我不知道在这种情况下如何使用 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

如果你们能帮忙就太好了。

谢谢

【问题讨论】:

  • 您使用的是哪个 DBMS?甲骨文? Postgres?

标签: sql join subquery cross-join erwin


【解决方案1】:

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

  • 构造一个查询,用一个结果行给出六月的值。
  • 构造一个查询,用一个结果行给出 May 的值。
  • 比较两个查询的结果。

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

【讨论】:

  • 我用需要交叉连接的两个表编辑了我的代码。您的逻辑是合理的,我想知道 CROSS JOIN 的正确语法
【解决方案2】:

你不能用子查询做点什么吗?我没有对此进行测试,但类似下面的内容应该为您提供 4 列、发票和 5 月和 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 2013-03-01
    • 1970-01-01
    • 2019-09-18
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多