【问题标题】:COUNT() is multiplying the the two individual column counts together, how do I get this to not happen?COUNT() 将两个单独的列计数相乘,我怎样才能避免这种情况发生?
【发布时间】:2017-10-25 20:36:32
【问题描述】:

以下是表格: 客户

custid(PK) custname custtype
001        john     null
002        rob      1

城市

cityid(PK) cityname
001        Baltimore
002        Knoxville

包装

packageid(PK) custid(PK,FK) cityid
001           001           001
001           002           001
002           001           002

现在我的查询是这样的:

SELECT DISTINCT CITYNAME, CUSTTYPE, COUNT(P.PACKAGEID) AS PACKAGE_COUNT
FROM CITY S LEFT OUTER JOIN PACKAGE P 
ON S.CITYID=P.CITYID,
CUSTOMER C INNER JOIN PACKAGE Q 
ON C.CUSTID=Q.CUSTID
GROUP BY CITYNAME, CUSTTYPE;

结果:

CITYNAME  CUSTTYPE PACKAGE_COUNT
BALTIMORE NULL     4
KNOXVILLE NULL     2
BALTIMORE 1        2
KNOXVILLE 1        0

我想看到的是:

CITYNAME  CUSTTYPE PACKAGE_COUNT
BALTIMORE NULL     1
KNOXVILLE NULL     1
BALTIMORE 1        1
KNOXVILLE 1        0

据我所知,cityname 计数乘以 custtype 计数,即 baltimore = 2 和 null = 2 因此 2*2 = 4。即使在包表中,baltimore 只收到一个来自 null custtype 的包。任何帮助将不胜感激

【问题讨论】:

  • 只运行查询的第一部分而不使用 group by,看看它会产生什么结果。 SELECT CITYNAME, CUSTTYPE, P.PACKAGEID FROM CITY S LEFT OUTER JOIN PACKAGE P ON S.CITYID=P.CITYID, CUSTOMER C INNER JOIN PACKAGE Q ON C.CUSTID=Q.CUSTID
  • 当我运行查询的第一部分时,我明白你的意思是查询重复记录,但是如果我将 DISTINCT 子句添加到 CITYNAME 它可以解决这个问题,但当聚合函数为重新包含在查询中,但谢谢。

标签: sql count ssms aggregate-functions


【解决方案1】:

使用交叉连接生成所有行,然后进行左连接和聚合:

SELECT C.CITYNAME, CT.CUSTTYPE, COUNT(P.PACKAGEID) AS PACKAGE_COUNT
FROM CITY S CROSS JOIN
     (SELECT DISTINCT CUSTTYPE FROM CUSTOMER) CT LEFT OUTER JOIN
     PACKAGE P 
     ON S.CITYID = P.CITYID AND CT.CUSTID = P.CUSTID
GROUP BY C.CITYNAME, CT.CUSTTYPE;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2015-08-10
    • 2010-10-28
    相关资源
    最近更新 更多