Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql COUNT()是将两个单独的列计数相乘,如何避免这种情况发生?_Sql_Count_Ssms_Aggregate Functions - Fatal编程技术网

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;