0

クエリを作成するのに助けが必要です。

これが私が必要なものです:

dataというテーブルがあります:

   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が0.9+0.6 = 1.5> 0.4(米国の貢献)で貢献したため、トップの国はESです。

トップデバイスとトップシステムで同じロジック。**

私は総収入と製品のためにこのような何かがするだろうと思います:

SELECT SUM(value) as total_revenue,product FROM data GROUP BY product

しかし、どうすれば国、デバイス、システムを追加できますか?

これは単一のクエリでも実行可能ですか?そうでない場合、それを実行するための最良の方法(パフォーマンスの観点から)は何ですか?

助けてくれて本当にありがとうございます。

編集 私はよりよく説明するためにサンプルテーブルを編集しました。

4

3 に答える 3

1

別のクエリでそれを行います:

SELECT   product,
         SUM(value) AS amount
FROM     data
GROUP BY country    -- change to device, system, etc. as required
ORDER BY amount DESC
LIMIT    1
于 2012-11-11T23:29:09.450 に答える
1

その通りです...単純なクエリではありません...しかし、3 つのクエリが 1 つの結果にまとめられています。

サンプルをSQL Fiddle here に投稿しました...

最初のクエリ -- 最も内側。製品/国ごとにすべての収益を取得し、それを製品ごとに並べ替え、合計収益を降順に並べ替えて、製品ごとに最初の位置で最高の収益を得る必要があります。

次のクエリ (MySQL @variable use の使用を実装した場所)。最初の結果オーダーにはすでに製品と収益ランクの順序があるため、「@LastProd」が何であれ、製品が変更されるたびにランクを 1 に設定します...これにより、製品 1 の ES = ランク #1 が作成されます。米国 = 商品 1 のランク 2 で、他の「商品」に進みます。

最後の最も外側のクエリは、未加工のデータ テーブルに再結合しますが、問題の製品販売を構成するすべてのデバイスとシステムのリストを取得しますが、製品ランクが 1 位だった場合のみ取得します。

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
于 2012-11-12T01:45:59.093 に答える
0

あなたはそのようなsthをすることができます

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

それは醜いです、私はそれを使用しませんが、それは動作するはずです。

于 2012-11-11T23:26:23.440 に答える