Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 复杂sql查询(分组依据)_Mysql_Sql - Fatal编程技术网

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