【问题标题】:Finding the difference (subtraction) in SQL在 SQL 中查找差异(减法)
【发布时间】:2014-07-13 01:18:11
【问题描述】:

我正在尝试找出 2013 年和 2014 年 T 恤销量的差异。这两个查询本身确实给了我正确的销量。但是,我不知道如何比较这两个数字并返回它们的差异。有什么帮助吗?

select sum(qty)
from customers natural join orders
natural join itemsordered
natural join items
where orderdate >= '2014-01-01' and orderdate <= '2014-12-31' and description ='tshirt';

select sum(qty)
from customers natural join orders
natural join itemsordered
natural join items
where orderdate >= '2013-01-01' and orderdate <= '2013-12-31' and description ='tshirt';

使用的数据库如下:

客户(custID、姓名、firstOrderDate、城市)

经理(mgrID、姓名、薪水)
商店(storeID、城市、mgrID)
项目(itemID、描述、尺寸、颜色)
库存(storeID、itemID、数量)
订单(orderID、orderDate、custID)
ItemsOrdered(itemID, orderID, qty)

【问题讨论】:

  • 您使用的是什么数据库?需要明确的是,您想要一年中总项目的变化吗?所以查询只返回一个数字,是吗?
  • 对,返回的值应该是整数。但是,无论销售额同比增长 500 还是下降 500,它应该始终是一个正整数,应该返回 500(而不是 -500)。我更新了原始帖子以显示数据库信息。
  • 让绝对值部分起作用。谢谢,这个问题已经彻底解决了。

标签: sql difference


【解决方案1】:

您在 SUM() 函数中使用 case 表达式。在这里,您只过滤您感兴趣的 2 年的所有记录,然后使用案例,总结 2013 年的记录,总结 2014 年的记录,然后从另一个中减去其中一个。像这样:

select
      sum(case when orderdate >= '2013-01-01' and orderdate < '2014-01-01' then qty end) yr2013
    , sum(case when orderdate >= '2014-01-01' and orderdate < '2015-01-01' then qty end) yr2014

    , sum(case when orderdate >= '2014-01-01' and orderdate < '2015-01-01' then qty end)
    - sum(case when orderdate >= '2013-01-01' and orderdate < '2014-01-01' then qty end) diff

from customers 
natural join orders
natural join itemsordered
natural join items
where orderdate >= '2013-01-01' and orderdate < '2015-01-01' and description ='tshirt';

请注意我在日期范围逻辑中引入的小改动。使用“大于等于”和“小于(第二天)”的组合比在上下边界都包含等于更可靠。 (& 它适用于任何日期/时间精度,不会造成任何间隙或重叠。)

注意:以上内容应该是相当通用的,但处理日期的方法会因数据库类型而异(编写时未知)

【讨论】:

  • 这确实有效。但是,我试图只返回一个正整数,在我的数据库中,我得到 -86。我尝试添加 abs() 但遇到了错误。
【解决方案2】:

另一种方法是将两年行转为单行并执行差异。

select diff = abs(y13_qty - y14_qty) from
(select yr = year(orderdate), qty
from customers natural join orders
natural join itemsordered
natural join items
where year(orderdate) in (2013,2014) and description ='tshirt')
pivot (sum(qty) as qty for yr in (2013 as 'y13', 2014 as 'y14'))

(不熟悉 oracle,因此可能会关闭枢轴语法)

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多