2016-02-05 18 views
3

我有一個查詢創建一個交叉表。結果是txn_id對於branda的計數,對於brandb的計數爲txn_id有兩個條件的MySQL交叉表聚合

txn_id不是唯一的。這是事務表.:的一例

txn_id | nationality_id | sku | sales | units 

1  |  1   | 1 | 20 | 2 
1  |  1   | 2 | 15 | 1 
2  |  4   | 1 | 20 | 2 
3  |  2   | 1 | 10 | 1 
4  |  3   | 2 | 15 | 1 
5  |  4   | 1 | 10 | 1 

有2個其它表(products) - (sku, brand, product name),和(nationalities) - (nationality_id, nationality)

我想補充的第三列這讓我在那裏,這兩個品牌的購買

txn_id計數輸出應該

nationality | branda | brandb | combined 

    1   | 1  | 1 | 1 
    2   | 1  | 0 | 0 
    3   | 0  | 1 | 0 
    4   | 2  | 0 | 0 

當前查詢。

SELECT 
    nationalities.nationality, 
    COUNT((CASE brand WHEN 'branda' THEN txn_id ELSE NULL END)) AS branda, 
    COUNT((CASE brand WHEN 'brandb' THEN txn_id ELSE NULL END)) AS brandb 
<I want my 3rd column here> 
FROM 
    transaction_data 
     INNER JOIN 
    products USING (sku) 
     INNER JOIN 
    nationalities USING (nationality_id) 
GROUP BY nationality 
ORDER BY branda DESC 
LIMIT 20; 

我已經嘗試使用:

COUNT((CASE brand WHEN 'brandb' OR 'brandb' THEN txn_id ELSE NULL END)) AS combined - 但是這顯然返回過多(返回品牌A或品牌B不管他們是否一起購買的)。我知道我不能使用AND,因爲顯然沒有一個單元格將會是branda和brandb。

我也嘗試過使用: COUNT((CASE brand WHEN IN('branda', 'brandb') THEN txn_id ELSE NULL END)) AS combined - 但這不是有效的語法。

我覺得我應該使用HAVING子句,但我不知道這將如何在列列表中工作。

回答

0

我想你會需要聚集的兩個層次:

SELECT n.nationality, 
     sum(branda), sum(brandb), sum(branda * brandb) 
FROM (SELECT t.txn_id, n.nationality, 
      MAX(CASE brand WHEN 'branda' THEN 1 ELSE 0 END) AS branda, 
      MAX(CASE brand WHEN 'brandb' THEN 1 ELSE 0 END) AS brandb 
     FROM transaction_data t INNER JOIN 
      products p 
      USING (sku) INNER JOIN 
      nationalities n 
      USING (nationality_id) 
     GROUP BY t.txn_id, n.nationality 
    ) tn 
GROUP BY n.nationality 
ORDER BY max(txn_id) DESC 
LIMIT 20; 
+0

這個答案是有效的和接受的,但是,應該注意的是,這個查詢將大表(3M行) –

+0

可怕執行@AdamCopley 。 。 。性能真的比原來的查詢差得多嗎? –

+0

是的,它不會在一分鐘內運行(這是我停止它的時候,所以我把它分解成塊,然後單獨運行'subquery',那不會運行,然後我將'txn_id ''從列列表和'group by'中得到一些結果,我告訴他們'txn_id'在那裏,這個集合是正確的,我會在我回去工作時做一些解釋星期一向你展示更多關於索引和長度的詳細信息我繼承了dsnt的廢話表結構幫助了1.5M不同的事務ID超出了3.5M行,每個'txn id'有1到20行之間的任何地方' –