mkk*_*700 1 mysql sql pivot sum
下面是我的brand_of_items表的架构.为简单起见,此处显示了两列:id(primary和AI),symbol(varchar 50,unique)
Table - brand_of_items
id symbol
0 a
1 b
2 c
.. ..
10 j
Run Code Online (Sandbox Code Playgroud)
下面是我的items_of_brand的架构.
Table - mainIndexQuantity
id brand_of_items_id vol item_type salefinalizeddate
0 1 5 0 2005-5-11
1 1 6 0 2004-5-11
2 1 7 0 2011-5-11
3 1 8 0 2011-5-12
4 1 9 0 2011-5-12
5 1 10 0 2011-5-11
6 1 5 1 2012-5-11
7 1 6 1 2012-5-11
8 1 7 1 2011-5-11
9 1 8 1 2010-5-12
10 1 9 1 2012-5-12
11 1 10 1 2005-5-12
Run Code Online (Sandbox Code Playgroud)
mainIndexQuantity表brand_of_items_id列是指向brand_of_items(id)的外键.mainIndexQuantity表item_type列不是外键,它应该是.
这两个项目类型是:0 =零售,1 =批发
我想计算每个brand_brand_of_items表条目的项目类型(零售与批发)的比率.目标是看一个品牌商品是否在零售或批发销售更多.
**添加复杂性:我想在mainIndexQuantity表中添加一个日期列,并希望找出RetailVolume和WholesaleVolume之和的差异,并按salefinalizeddate字段对结果进行分组.
这是为了帮助确定哪些季节销售的商品更多,而且RetailVolume和WholeSaleVolume的总和(delta)差异将有助于选择最受关注的商品.
试试这个:
SELECT
b.id,
b.symbol,
IFNULL(SUM(m.item_type = 1), 0) / (COUNT(*) * 1.0) AS wholesaleRatio,
IFNULL(SUM(m.item_type = 0), 0) / (COUNT(*) * 1.0) AS RetailRatio
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id,
b.symbol;
Run Code Online (Sandbox Code Playgroud)
这会给你:
| ID | SYMBOL | WHOLESALERATIO | RETAILRATIO |
----------------------------------------------
| 0 | a | 0 | 0 |
| 1 | b | 0.5 | 0.5 |
| 2 | c | 0 | 0 |
| 10 | j | 0 | 0 |
Run Code Online (Sandbox Code Playgroud)
假如说:
wholesaleRatio 是整个销售类型的项目的计数到所有项目的计数.RetailRatio是retail所有项目计数的类型项目的计数.如果这个比例是vol列的总和与总数的比较,vol那么你可以这样做:
SELECT
b.id,
b.symbol,
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) / SUM(m.vol) AS wholesaleRatio,
SUM(CASE WHEN m.item_type = 0 THEN m.vol ELSE 0 END) / SUM(m.vol) AS RetailRatio
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id,
b.symbol;
Run Code Online (Sandbox Code Playgroud)
注意:
LEFT JOIN,所以你得到了结果集中不匹配的行,即那些没有条目MainIndexQuantity表的品牌项.如果您不想包含它们,请INNER JOIN改用.1.0@JW所示,乘以得到带小数位的计数.包括Total Volume,Retail Volume Sum并Wholesale Volume sum试试这个:
SELECT
b.id,
b.symbol,
IFNULL(SUM(m.item_type = 1), 0) * 1.0 / COUNT(*) AS wholesaleRatio,
IFNULL(SUM(m.item_type = 0), 0) * 1.0 / COUNT(*) AS RetailRatio,
IFNULL(SUM(m.vol), 0) AS 'Total Volume',
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS 'Retail Volume sum',
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS 'Wholesale Volume sum'
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id,
b.symbol;
Run Code Online (Sandbox Code Playgroud)
这会给你:
| ID | SYMBOL | WHOLESALERATIO | RETAILRATIO | TOTAL VOLUME | RETAIL VOLUME SUM | WHOLESALE VOLUME SUM |
--------------------------------------------------------------------------------------------------------
| 0 | a | 0 | 0 | 0 | 0 | 0 |
| 1 | b | 0.5 | 0.5 | 90 | 45 | 45 |
| 2 | c | 0 | 0 | 0 | 0 | 0 |
| 10 | j | 0 | 0 | 0 | 0 | 0 |
Run Code Online (Sandbox Code Playgroud)
如果要按这些总和和总和对结果集进行排序,请将此查询放在子查询中,然后可以执行以下操作:
SELECT *
FROM
(
SELECT
b.id,
b.symbol,
IFNULL(SUM(m.item_type = 1), 0) * 1.0 / COUNT(*) AS wholesaleRatio,
IFNULL(SUM(m.item_type = 0), 0) * 1.0 / COUNT(*) AS RetailRatio,
IFNULL(SUM(m.vol), 0) AS TotalVolume,
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS RetailVolumeSum,
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS WholesaleVolumeSum
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id,
b.symbol
) AS sub
ORDER BY RetailVolumeSum DESC,
WholesaleVolumeSum DESC;
Run Code Online (Sandbox Code Playgroud)
但是你的最后一个要求并不清楚,你是否正在寻找那些具有最高retio/wholesale ratis和volumns或者选择最高价值的品牌?
对于后者:
SELECT *
FROM
(
SELECT
b.id,
b.symbol,
IFNULL(SUM(m.item_type = 1), 0) * 1.0 / COUNT(*) AS wholesaleRatio,
IFNULL(SUM(m.item_type = 0), 0) * 1.0 / COUNT(*) AS RetailRatio,
IFNULL(SUM(m.vol), 0) AS TotalVolume,
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS RetailVolumeSum,
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS WholesaleVolumeSum
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id,
b.symbol
) AS sub
ORDER BY RetailVolumeSum DESC,
WholesaleVolumeSum DESC,
TotalVolume DESC
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
要获得总容量最高的品牌,您可以这样做:
SELECT
b.id,
b.symbol,
IFNULL(SUM(m.item_type = 1), 0) * 1.0 / COUNT(*) AS wholesaleRatio,
IFNULL(SUM(m.item_type = 0), 0) * 1.0 / COUNT(*) AS RetailRatio,
IFNULL(SUM(m.vol), 0) AS TotalVolume,
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS RetailVolumeSum,
SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS WholesaleVolumeSum
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id,
b.symbol
HAVING SUM(m.vol) = (SELECT MAX(TotalVolume)
FROM
(
SELECT brand_of_items_id, SUM(vol) AS TotalVolume
FROM mainIndexQuantity
GROUP BY brand_of_items_id
) t);
Run Code Online (Sandbox Code Playgroud)
像这样.
注意:
这将为您提供总体积最高的品牌,如果您正在寻找具有最高比率的品牌,您必须更换having子句以获得最大比率而不是总体积的最大值.
这将为您提供总体积最高的项目,因此您可能希望拥有超过项目,以防有多个项目具有最高总体积,例如在此更新的小提示演示中.在这种情况下,要获得只有一个,您必须使用LIMIT只返回一个.