Sql COUNT()是将两个单独的列计数相乘,如何避免这种情况发生?
以下是表格: 顾客 城市 包装Sql COUNT()是将两个单独的列计数相乘,如何避免这种情况发生?,sql,count,ssms,aggregate-functions,Sql,Count,Ssms,Aggregate Functions,以下是表格: 顾客 城市 包装 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 OUTE
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。即使在package表中,baltimore也只从null custtype接收一个包。任何帮助都将不胜感激使用交叉连接生成所有行,然后执行左连接和聚合:
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;
只需在不使用GROUPBY的情况下运行查询的第一部分,然后看看它会产生什么结果。在S.CITYID=P.CITYID上从城市的左侧外部连接包P中选择CITYNAME、CUSTTYPE、P.PACKAGEID,当我运行查询的第一部分时,CUSTOMER C internal JOIN PACKAGE Q ON C.CUSTID=Q.CUSTIDI理解您对重复记录的查询是什么意思,但如果我将DISTINCT子句添加到CITYNAME中,它将修复该问题,但在聚合函数重新包含在查询中时不会修复该问题,但谢谢。
CITYNAME CUSTTYPE PACKAGE_COUNT
BALTIMORE NULL 1
KNOXVILLE NULL 1
BALTIMORE 1 1
KNOXVILLE 1 0
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;