我有一个查询,用于创建交叉表。结果是计算“branda”的txn_id
总数和“brandb”的txn_id
总数。
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
还有两张表格 (产品) - (sku, 品牌, 产品名称)
和 (国籍) - (国籍 ID, 国籍)
。
我想新增第三列,以获取购买了两个品牌的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,因为显然没有单个单元格既是品牌a又是品牌b。我还尝试过:
COUNT((CASE brand WHEN IN('branda', 'brandb') THEN txn_id ELSE NULL END)) AS combined
- 但这不是有效的语法。我觉得应该使用
HAVING
子句,但我不确定它在列列表中该如何工作。
subquery
。然后我从“列列表”和“group by”中剥离了txn_id
并得到了一些结果。通过这些结果,我可以得出如果有“txn_id”,则集合将是正确的结论。当我周一回到办公室时,我会发布一些解释,以显示更多关于索引和长度的详细信息。我所继承的垃圾表结构也不是很有用,因为 350 万行中有 150 万个不同的交易 ID,每个“txn id”之间的行数在 1 至 20 行之间不等。 - Adam Copleycount(distinct)
而不是count()
来完成你想要的操作...你可能会发现distinct真的会影响性能。 - Gordon Linoff