Mysql按行计算分割行数

时间:2014-05-27 13:10:13

标签: mysql

我有以下表格 http://sqlfiddle.com/#!2/d0a3d

sp | product | exp
1    A       | 50
1    B         50
1    A         100
1    B         100
2    B         200
2    C         200
3    A         50
3    B         50   

技术我想将exp除以与t_id相关的产品总数

The final result should be
 sp |  A   | B   |  C
 1  | 150  | 150 |  0
 2  |  0   | 200 | 200
 3  |  50  | 50  |  0

3 个答案:

答案 0 :(得分:1)

可以这样做(完成匹配你的sql小提琴列): -

SELECT b.sp_id, 
    SUM(IF(a.product = 'A', b.exp, 0)) AS A,
    SUM(IF(a.product = 'B', b.exp, 0)) AS B,
    SUM(IF(a.product = 'C', b.exp, 0)) AS C
FROM topic_product a
INNER JOIN exp_speaker_topic b
ON a.t_id = b.t_id
GROUP BY b.sp_id

但是在添加额外值时会发生混乱。

编辑 - 修改为我认为你想要的东西。

SELECT sp_id, 
    SUM(IF(product = 'A', avg_exp, 0)) AS A,
    SUM(IF(product = 'B', avg_exp, 0)) AS B,
    SUM(IF(product = 'C', avg_exp, 0)) AS C
FROM 
(
    SELECT sp_id, a.product, exp / Sub1.product_count AS avg_exp
    FROM topic_product a
    INNER JOIN exp_speaker_topic b
    ON a.t_id = b.t_id
    INNER JOIN
    (
        SELECT t_id, COUNT(*) AS product_count
        FROM topic_product 
        GROUP BY t_id
    ) Sub1
    ON a.t_id = Sub1.t_id
) Sub2
GROUP BY sp_id

SQL小提琴: -

http://sqlfiddle.com/#!2/d0a3d/33

答案 1 :(得分:0)

以下SQL Fiddle演示了以下查询。

您还可以使用以下CASE语句:

SELECT e.sp_id, 
  SUM(CASE WHEN t.product = 'A' THEN e.exp ELSE 0 END) AS A,
  SUM(CASE WHEN t.product = 'B' THEN e.exp ELSE 0 END) AS B,
  SUM(CASE WHEN t.product = 'C' THEN e.exp ELSE 0 END) AS C
FROM topic_product t INNER JOIN exp_speaker_topic e ON t.t_id = e.t_id
GROUP BY e.sp_id;

如果要除以记录数,请使用以下内容:

SELECT e.sp_id, 
  SUM(CASE WHEN t.product = 'A' THEN e.exp ELSE 0 END) / 
  SUM(CASE WHEN t.product = 'A' THEN 1 ELSE 0 END) AS A,
  SUM(CASE WHEN t.product = 'B' THEN e.exp ELSE 0 END) / 
  SUM(CASE WHEN t.product = 'B' THEN 1 ELSE 0 END) AS B,
  SUM(CASE WHEN t.product = 'C' THEN e.exp ELSE 0 END) / 
  SUM(CASE WHEN t.product = 'C' THEN 1 ELSE 0 END) AS C
FROM topic_product t INNER JOIN exp_speaker_topic e ON t.t_id = e.t_id
GROUP BY e.sp_id;

如果你想摆脱Null,你可以使用以下内容:

SELECT m.sp_id,
CASE WHEN ISNULL(m.A) = 0 THEN m.A ELSE 0 END AS A,
CASE WHEN ISNULL(m.B) = 0 THEN m.B ELSE 0 END AS B,
CASE WHEN ISNULL(m.C) = 0 THEN m.C ELSE 0 END AS C
FROM 
(
  SELECT e.sp_id, 
    SUM(CASE WHEN t.product = 'A' THEN e.exp ELSE 0 END) / SUM(CASE WHEN t.product = 'A' THEN 1 ELSE 0 END) AS A,
    SUM(CASE WHEN t.product = 'B' THEN e.exp ELSE 0 END) / SUM(CASE WHEN t.product = 'B' THEN 1 ELSE 0 END) AS B,
    SUM(CASE WHEN t.product = 'C' THEN e.exp ELSE 0 END) / SUM(CASE WHEN t.product = 'C' THEN 1 ELSE 0 END) AS C
  FROM topic_product t INNER JOIN exp_speaker_topic e ON t.t_id = e.t_id
  GROUP BY e.sp_id
) AS m;

答案 2 :(得分:0)

好的,缓慢的一天。只需执行以下操作,并处理缺少的结果并在表示层/应用程序级代码中显示逻辑(例如,一个简单的php循环作用于有序数组)...

SELECT p.product
     , s.sp_id
     , SUM(s.exp/x.cnt) total
  FROM topic_product p
  JOIN exp_speaker_topic s
    ON s.t_id = p.t_id
  JOIN
     (  SELECT t_id
             , COUNT(0) cnt
          FROM topic_product 
         GROUP 
            BY t_id
     ) x
    ON x.t_id = p.t_id
 GROUP  
    BY sp_id,product;