Mysql 复杂sql查询(分组依据)
我需要一些帮助来建立一个查询 以下是我需要的: 我有一个名为“数据”的表:Mysql 复杂sql查询(分组依据),mysql,sql,Mysql,Sql,我需要一些帮助来建立一个查询 以下是我需要的: 我有一个名为“数据”的表: ID| PRODUCT | VALUE |COUNTRY| DEVICE | SYSTEM -----+---------+-------+-------+---------+-------- 48 | p1 | 0.4 | US | dev1 | system1 47 | p2 | 0.67 | IT | dev2 | system2 46
ID| PRODUCT | VALUE |COUNTRY| DEVICE | SYSTEM
-----+---------+-------+-------+---------+--------
48 | p1 | 0.4 | US | dev1 | system1
47 | p2 | 0.67 | IT | dev2 | system2
46 | p3 | 1.2 | GB | dev3 | system3
45 | p1 | 0.9 | ES | dev4 | system4
44 | p1 | 0.6 | ES | dev4 | system1
我需要说明哪些产品产生了最多的收入,哪些国家、设备和系统贡献最大
**例如:我从表中得到的结果是:
PRODUCT | TOTAL COST |COUNTRY| DEVICE | SYSTEM
-------+------------+-------+---------+--------
p1 | 1.9 | ES | dev4 | system1
p2 | 0.67 | IT | dev2 | system2
p3 | 1.2 | GB | dev3 | system3
排名第一的国家是ES,因为ES贡献了0.9+0.6=1.5>0.4(美国的贡献)
顶层设备和顶层系统的逻辑相同**
我想对于总收入和产品来说,这样的东西可以:
SELECT SUM(value) as total_revenue,product FROM data GROUP BY product
但如何添加国家、设备和系统
这在单个查询中是否可行,如果不可行,最好的方法(性能方面)是什么
非常感谢你的帮助
编辑
我编辑了示例表以便更好地解释。你可以这样做
CREATE TABLE data
(
id int auto_increment primary key,
product varchar(20),
country varchar(4),
device varchar(20),
system varchar(20),
value decimal(5,2)
);
INSERT INTO data (product, country, device, system, value)
VALUES
('p1', 'US', 'dev1', 'system1', 0.4),
('p2', 'IT', 'dev2', 'system2', 0.67),
('p1', 'IT', 'dev1', 'system2', 0.23);
select 'p' as grouping_type, product, sum(value) as sumval
from data
group by product
union all
select 'c' as grouping_type, country, sum(value) as sumval
from data
group by country
union all
select 'd' as grouping_type, device, sum(value) as sumval
from data
group by device
union all
select 's' as grouping_type, system, sum(value) as sumval
from data
group by system
order by grouping_type, sumval
它很难看,我不会使用它,但它应该可以工作。在单独的查询中执行:
SELECT product,
SUM(value) AS amount
FROM data
GROUP BY country -- change to device, system, etc. as required
ORDER BY amount DESC
LIMIT 1
你是对的。。。这不仅仅是一个简单的查询。。。但是3个查询被打包成一个结果 我已经把我的样品寄出了 第一个查询——最内部的查询。您需要根据每个产品/国家/地区获得所有收入,并根据产品和总收入进行排序,以使每个产品的收入最高 下一个查询(在这里我实现了MySQL@variable use的使用)。由于第一个结果订单已经按照产品和收入排名进行了排序,所以每次产品从“@LastProd”更改时,我都会将排名设置为1。。。这将为产品1创建ES=Rank#1,然后为产品1创建US=Rank#2,然后继续其他“产品” 最后一个最外层的查询将重新连接回原始数据表,但会获得组成所讨论产品销售的所有设备和系统的列表,但仅在产品排名为#1的位置
您需要在单个查询中进行此操作是否有特定的原因?您的问题不清楚:我的理解是,您希望产品产生最多的收入,但在给定的产品中,这是每个国家/设备/系统的比例。是这样吗?嗨,请检查我的编辑,我想现在更清楚了。这看起来不像是要求的。“按多个字段分组”将给出这些字段的每个组合的总和,例如每个产品X国家/地区的总和,而不是每个产品的总和和每个国家/地区的总和。您使用的是
UNION
而不是UNION ALL
的任何特定原因?
select
pqRank.product,
pqRank.country,
pqRank.revenue,
group_concat( distinct d2.device ) as PartDevices,
group_concat( distinct d2.system ) as PartSystems
from
( select
pq.product,
pq.country,
pq.revenue,
@RevenueRank := if( @LastProd = pq.product, @RevenueRank +1, 1 ) as ProdRank,
@LastProd := pq.product
from
( select
d.product,
d.country,
sum( d.value ) as Revenue
from
data d
group by
d.product,
d.country
order by
d.product,
Revenue desc ) pq,
( select @RevenueRank := 0,
@LastProd := ' ') as sqlvars
) pqRank
JOIN data d2
on pqRank.product = d2.product
and pqRank.country = d2.country
where
pqRank.ProdRank = 1
group by
pqRank.product,
pqRank.country