2017-05-30 14 views
2

mysqlの複雑なクエリについては約200のサンプルページを研究していますが、それにはまっています。Mysqlの複雑な4つのテーブルからクエリを選択

これは私のstucture

Table name: zones 

zoneId | zoneName 
------------------ 

Table name: customers 

customesId | zoneId | customerName 
---------------------------------- 

Table name: products 

productId | productName 
----------------------- 

Table name: sales 

sid | zoneId | customerId | productId | amount 
---------------------------------------------- 

のみ、クエリで次の出力を取得することが可能ですか?

私が "0" であっても、顧客や製品として取得したい
zoneName | customerName | productName | amount(SUM) 
--------------------------------------------------- 
ZoneX | customerA | productName_1 | 10 
     |    | productName_2 | 0 
     |    | productName_3 | 4 
     |    | productName_4 | 0 
ZoneX | customerB | productName_1 | 7 
     |    | productName_2 | 0 
     |    | productName_3 | 4 
     |    | productName_4 | 3 
....... 

は販売を持っていない私が試した:

SELECT zones.zoneName 
    , customers.customerName 
    , products.productName 
    , SUM(amount) AS amount 
FROM customers 
INNER JOIN zones 
    ON customers.zoneId = zones.zoneId 
LEFT JOIN sales 
    ON customers.customerId = sales.customerId 
LEFT JOIN products 
    ON sales.productId = products.productId 
+0

はい可能です。なぜ私はあなたがゾーンXと顧客Aをすべてのレコードに表示したくないのか分かりません。さらに、0レコードを取得するには、外部結合を使用する必要があります。 – xQbert

+0

あなたは '額(金額、0)を金額として合計する必要があるように見え、売上がないときに処理する製品に各顧客を参加させる必要があります。 – xQbert

+1

アプリケーションレベルのコードでデータ表示の問題を扱うことを真剣に検討してください。 – Strawberry

答えて

2

各顧客が販売に関係なくすべての製品をリストアップするように、すべての顧客を製品にクロスジョインする必要があります。

SELECT z.zoneName 
    , c.customerName 
    , p.productName 
    , SUM(coalesce(s.amount,0)) AS amount 
FROM customers c 
INNER JOIN zones z 
    ON c.zoneId = z.zoneId 
CROSS JOIN PRODUCTS P 
LEFT JOIN sales S 
    ON c.customerId = s.customerId 
and s.productID = p.productID 
GROUP BY z.zoneName 
     , c.customerName 
     , p.productName 
+1

OPへの注意:顧客がいない 'ゾーン 'がある場合は、最初にゾーンを持つ' CROSS JOIN'と 'customers'と' LEFT JOIN'をする必要があります –

+0

ありがとうJuan Carlos Oropeza。いいえ、各顧客にはゾーンがあります。 xQbert、あなたはあなたの最後のコメントで言ったようにあなたの答えを更新できますか?申し訳ありませんが、この種のcomlepxクエリを控えめにするのは難しいです。 – user3325207

+0

申し訳ありませんが、150秒以上経過すると1レコードを返します。私は50のゾーン、100の顧客と75000の売上高を持っています。それになる? – user3325207

0

あなたが

SELECT c.zoneId ,c.customesId ,c.customerName,IF(s.amount IS NULL, 0 , s.amount) 
FROM customers AS c, products AS p 
LEFT JOIN sales AS s ON s.productId = p.productId and s.customersid = c.customersid 

希望これをこのクエリを試すことができます助けてください。

+0

カンマ演算子は、明示的な結合演算子よりも優先順位が低く、さらに、販売だけでなく、顧客にも関連しています。 – Shadow

関連する問題