2017-10-25 7 views
0

ここではテーブルです: CUSTOMERCOUNT()は2つの個々の列数を掛け合わせていますが、どうすればこの問題が起こらないのですか?

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

CITY

cityid(PK) cityname 
001  Baltimore 
002  Knoxville 

PACKAGE

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 

がある:私はので、すなわちボルティモア= 2とヌル= 2 2をカウントcityname数がcusttypeが掛けられている伝えることができるものから、

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

* 2 = 4.パッケージテーブルでは、baltimoreはnull custtypeから1つのパッケージのみを受け取ります。すべてのヘルプは

+0

だけでグループなしに、クエリの最初の部分を実行し、それが生み出すものを参照してください。 CITY S LEFT OUTER FROM SELECT CITYNAME、CUSTTYPE、P.PACKAGEID はS.CITYID = P.CITYIDたパッケージP のJOIN、 CUSTOMER C INNER = Q.CUSTID – Amit

+0

私はあなたが何を意味するかを理解するC.CUSTID ON PACKAGE Q を登録しようクエリの最初の部分を実行したときに重複レコードを照会しますが、CITYNAMEにDISTINCT句を追加すると、それは修正されますが、集計関数がクエリに再組み込みされても問題は解決しませんが、ありがとうございます。 –

答えて

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; 
関連する問題