2016-09-28 14 views
0

postgreSQL 9.4 dbを照会すると、各顧客が以前の注文に基づいて各従業員とどのくらいの頻度で対話しているかを知りたい。 (少なくとも一桁が2つの間で行われたと仮定した場合)複数のCOUNT/GROUP BY文が予期しない結果を返す

CUSTOMER  EMPLOYEE INTERACTIONS CUSTOMER_TOTAL 
Customer1 EmployeeA    30    50 
Customer1 EmployeeB    20    50 
Customer2 EmployeeD    6    15 
Customer2 EmployeeA    6    15 
Customer2 EmployeeC    3    15 

...私は、顧客や従業員のすべての組み合わせの結果で別々のレコードを持っている:私の目的は、次の形式でデータを取得することです。

顧客と各従業員(上記の列3を参照)との間に注文数を含む列と、各顧客全体の注文総数(上記の列4を参照)を含む列を含める必要があります。

SELECT customer.name as Customer, employee.name as Employee, 
    SUM(CASE WHEN orders.employee_id = employee.id AND orders.customer_id = customer.id THEN 1 ELSE 0 END) AS Interactions, 
    SUM(CASE WHEN orders.customer_id = customer.id THEN 1 ELSE 0 END) AS Customer_Total 

FROM tblcustomer customer 
    JOIN tblorder orders ON orders.customer_id = customer.id 
    LEFT JOIN tblemployee employee ON employee.id = orders.employee_id 

GROUP BY customer.name, employee.name 

ORDER BY Customer, Interactions DESC; 

次の結果が返されました::予想通り

CUSTOMER  EMPLOYEE INTERACTIONS CUSTOMER_TOTAL 
Customer1 EmployeeA    30    30 
Customer1 EmployeeB    20    20 
Customer2 EmployeeD    6    6 
Customer2 EmployeeA    6    6 
Customer2 EmployeeC    3    3 

すべての行/列が最後の列を除いて、表示され

私は、次のクエリを書いています。各顧客の合計発注数ではなく、従業員が一致した発注のみを返しています。どこが間違っていたのですか?

+0

CUSTOMER_TOTAL for Customer1は50であり、Customer2は15である必要がありますか? –

+0

はい、上の例のとおりです。 – Rory

答えて

0

私はあなたがここにLEFT JOINを使用する必要があると思う:

SELECT customer.name as Customer, 
     employee.name as Employee, 
     SUM(CASE WHEN orders.employee_id = employee.id AND 
         orders.customer_id = customer.id 
        THEN 1 ELSE 0 END) AS Interactions, 
     SUM(CASE WHEN orders.customer_id = customer.id 
        THEN 1 ELSE 0 END) AS Customer_Total 
FROM tblcustomer customer 
LEFT JOIN tblorder orders 
    ON orders.customer_id = customer.id 
LEFT JOIN tblemployee employee 
    ON employee.id = orders.employee_id 
GROUP BY customer.name, 
     employee.name 
ORDER BY Customer, 
     Interactions DESC; 

私の勘では、あなたのINNER JOIN sが顧客の合計を含むであろうレコードをフィルタリングしているということです。 LEFT JOINを使用すると、これらのレコードが保持されます。

+0

私は自分の結合を「LEFT JOIN」に置き換えましたが、残念なことに同じ結果が出ました。 – Rory

0

tblEmployeeと1つ左の結合でタスクが実行されます。 tblEmployeeとの内部結合は、顧客と各従業員との間の注文数であるレコードのみをフィルタリングして取得します。

SELECT customer.name as Customer, 
    employee.name as Employee, 
    SUM(CASE WHEN orders.employee_id = employee.id AND 
        orders.customer_id = customer.id 
       THEN 1 ELSE 0 END) AS Interactions, 
    SUM(CASE WHEN orders.customer_id = customer.id 
       THEN 1 ELSE 0 END) AS Customer_Total 
    FROM tblcustomer customer 
    JOIN tblorder orders 
    ON orders.customer_id = customer.id 
    LEFT JOIN tblemployee employee 
    ON employee.id = orders.employee_id 
    GROUP BY customer.name, 
    employee.name 
    ORDER BY Customer, 
    Interactions DESC; 
+0

2番目の内部結合をLEFT JOINと置き換えようとしましたが、結果には影響しませんでした。私はまた両方の結合を 'LEFT JOIN'と交換することを試みました。 – Rory

関連する問題