我有一個查詢創建一個交叉表。結果是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
子句,但我不知道這將如何在列列表中工作。
這個答案是有效的和接受的,但是,應該注意的是,這個查詢將大表(3M行) –
可怕執行@AdamCopley 。 。 。性能真的比原來的查詢差得多嗎? –
是的,它不會在一分鐘內運行(這是我停止它的時候,所以我把它分解成塊,然後單獨運行'subquery',那不會運行,然後我將'txn_id ''從列列表和'group by'中得到一些結果,我告訴他們'txn_id'在那裏,這個集合是正確的,我會在我回去工作時做一些解釋星期一向你展示更多關於索引和長度的詳細信息我繼承了dsnt的廢話表結構幫助了1.5M不同的事務ID超出了3.5M行,每個'txn id'有1到20行之間的任何地方' –