【问题标题】:Oracle SQL Count with join带有连接的 Oracle SQL 计数
【发布时间】:2014-09-01 11:57:22
【问题描述】:

我正在尝试根据订单类型计算订单和订单行。到目前为止,我已经计算了每种订单类型的订单标题。

SELECT lifnr, 
  COUNT(CASE WHEN e1.bsart = 'NB' THEN 1 ELSE NULL END) Schedule_Orders,
  COUNT(CASE WHEN e1.bsart = 'ZNBS' THEN 1 ELSE NULL END) Store_Orders, 
  COUNT(CASE WHEN e1.bsart = 'ZCSO' THEN 1 ELSE NULL END) Third_Party,
  COUNT(CASE WHEN e1.bsart NOT IN ('ZCSO', 'NB', 'ZNBS' ) THEN 1 ELSE NULL END) Other_Orders,
  COUNT(*) Total_Orders
FROM saprpe.ekko e1 
JOIN saprpe.ekpo p1
ON e1.ebeln = p1.ebeln
WHERE e1.aedat BETWEEN '20130701' AND '20140701'
GROUP BY lifnr

订单行存储在 EKPO 表中,因此我使用文档编号将 EKKO 加入 EKPO。我如何计算上述案例中每种订单类型的订单行?我只计算了所有订单行,而不是专门针对每种订单类型。

额外信息: Order 标头存储在 EKKO 中,其中包含 Vendor、OrderNumber 和 OrderType。 EKKO 与包含订单行的表 EKPO 具有一对多的关系。订单行通过订单号与订单表头相关。 我要做的是获取三种订单类型 NB、ZNBS 和 ZCSO 的总订单标题,以及每种订单类型的总行数。都放到自己的专栏里

例如我想看看;

供应商1,10 个 NB 订单,100 个 NB 订单行,0 个 ZNBS 订单,0 个 ZNBS 订单行,5 个 ZCSO 订单,15 个 ZCSO 订单行,15 个总订单,115 个总订单行

如果我需要澄清任何事情,请指出。我应该注意,我更喜欢在单个 SQL 查询中使用它,我可以使用 WHERE 子句为每个订单类型在单个查询的基础上对其进行管理。

【问题讨论】:

  • 你能提供样本数据和想要的结果吗?我仍然不明白您所说的“我如何计算上述案例中每种订单类型的订单行数?”
  • 在这里格式化一些示例数据简直是一场噩梦!我将编辑内容以使其更清晰

标签: sql oracle join count


【解决方案1】:

经过反复试验、谷歌搜索等,我最终到达了那里。

SELECT 
  lifnr,
  COUNT(DISTINCT (CASE WHEN e1.bsart = 'NB' THEN e1.ebeln ELSE NULL END)) Schedule_Orders,
  COUNT(CASE WHEN e1.bsart = 'NB' THEN e1.ebeln ELSE NULL END) Schedule_Order_Lines,
  COUNT(DISTINCT (CASE WHEN e1.bsart = 'ZNBS' THEN e1.ebeln ELSE NULL END)) Store_Orders,
  COUNT(CASE WHEN e1.bsart = 'ZNBS' THEN e1.ebeln ELSE NULL END) Store_Order_Lines,
  COUNT(DISTINCT (CASE WHEN e1.bsart = 'ZCSO' THEN e1.ebeln ELSE NULL END)) Third_Party,
  COUNT(CASE WHEN e1.bsart = 'ZCSO' THEN e1.ebeln ELSE NULL END) Third_Party_Lines,
  COUNT(DISTINCT (CASE WHEN e1.bsart NOT IN ('ZCSO', 'NB', 'ZNBS' ) THEN e1.ebeln ELSE NULL END)) Other_Orders,
  COUNT(CASE WHEN e1.bsart NOT IN ('ZCSO', 'NB', 'ZNBS') THEN e1.ebeln ELSE NULL END) Other_Order_Lines,
  COUNT(DISTINCT(e1.ebeln)) Total_Orders,
  COUNT(e1.ebeln) Total_Order_Lines
FROM saprpe.ekko e1
LEFT JOIN saprpe.ekpo p1
ON e1.ebeln = p1.ebeln
WHERE e1.aedat BETWEEN '20130701' AND '20140701'
GROUP BY lifnr

由于表之间的关系,JOIN 最初使我的标题计数与行计数相同...将 DISTINCT 添加到我的标题计数并使用行计数的大小写使我能够计算这些订单类型。

【讨论】:

  • 您可能需要查看“decode”关键字。它可能会简化您的某些情况 - when 语句。你不能总是替换它,但这看起来是一个很好的例子。
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多