【问题标题】:COUNT(INVOICE.INV_NUM) giving different answers in two separate scenariosCOUNT(INVOICE.INV_NUM) 在两个不同的场景中给出不同的答案
【发布时间】:2018-05-02 00:10:32
【问题描述】:

我编写了一个查询,我想在其中显示“客户编号”(CUSTOMER 表)、“发票数量”(INVOICE 表),即每个客户的总发票,以及“总 Cus 购买” (通过连接 CUSTOMER、INVOICE 和 LINE 表计算得出),这是属于每个客户的所有发票中所有购买的总和。

第一个查询输出错误的“发票数量”。

--First Query    
SELECT CUSTOMER.CUST_NUM AS "Customer Number",
COUNT(INVOICE.INV_NUM) AS "Number of Invoices",
SUM(LINE.LINE_UNITS * LINE.LINE_PRICE) AS "Total Cus Purchases"
FROM CUSTOMER
JOIN INVOICE
ON CUSTOMER.CUST_NUM = INVOICE.CUST_NUM
JOIN LINE
ON INVOICE.INV_NUM = LINE.INV_NUMBER
GROUP BY CUSTOMER.CUST_NUM;

Customer Code Number of Invoices Total Cus Purchases

     1000              5              188.72
     1003              6               432.8
     1001              3               34.92
     1002              1               70.44

但是,第二个查询(在省略用于计算“总客户购买量”的 LINE 的连接语句时会注意到这一点)会输出正确的“发票数量”。

--Second Query
SELECT 
CUSTOMER.CUST_NUM AS "Customer Number", 
COUNT(INVOICE.INV_NUM) AS "Number of Invoices"
FROM INVOICE
JOIN CUSTOMER ON INVOICE.CUST_NUM = CUSTOMER.CUST_NUM
GROUP BY CUSTOMER.CUST_NUM;

Customer Code Number of Invoices

     1000                  3
     1003                  2
     1001                  2
     1002                  1

如何更正第一个查询,以便它吐出第二个查询中显示的值?

(注意:cus 采购总额是正确的,只是“发票数量”列错误。)

【问题讨论】:

  • 如果这些答案之一解决了您的问题,您应该接受它,以便其他用户可以找到解决方案并关闭问题。如果他们没有,请提供更多信息以便回答问题。

标签: sql database oracle


【解决方案1】:

COUNT(DISTINCT) 解决了计数问题,但您也可以通过将JOIN 删除到CUSTOMER 表中来简化查询:

SELECT i.CUST_NUM AS "Customer Number",
       COUNT(DISTINCT i.INV_NUM) AS "Number of Invoices",
       SUM(l.LINE_UNITS * l.LINE_PRICE) AS "Total Cus Purchases"
FROM INVOICE i JOIN
     LINE l
     ON i.INV_NUM = l.INV_NUMBER
GROUP BY i.CUST_NUM;

您正在使用CUST_NUM,它位于INVOICE 表中。

【讨论】:

  • 这几乎不可能是一个 MCVE :) 并且 OP 实际上想要客户表中的一些字段......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2015-04-02
  • 1970-01-01
  • 2014-02-24
  • 2012-09-28
相关资源
最近更新 更多