2016-01-24 34 views
0

我想將同一個media_type值的所有行組合到一行。SQL查詢:將多行[使用CASE當x IN(1,2,3 ...)]組合到一行

這裏是我的查詢(略作修改,以保持私有信息私有):

SELECT 
CASE 
    WHEN media_type IN ('1','3') THEN 'A' 
    WHEN media_type IN ('2','4') THEN 'B' 
    WHEN media_type IN ('5','21','22') THEN 'C' 
    WHEN media_type IN ('7','8','23') THEN 'D' 
    WHEN media_type IN ('9') THEN 'E' 
END AS media_type, 
SUM(imp) as imps, 
SUM(seller_revenue) as seller_revenue, 
SUM(seller_revenue)/SUM(imp) as CPM 

FROM 
    table 

WHERE 
    dd = '2016-01-19' 

GROUP BY 
    media_type 

ORDER BY 
    seller_revenue desc 

LIMIT 100; 

電流輸出(數據改變了隱私):

media_type imps seller_revenue cpm 
A 2681524581 4636356 1.729 
B 18152099106 22345234 1.231 
A 113355218.6 635356 5.605 
A 83881452.47 235623 2.809 
A 27994649.23 235435 8.41 
C 4924414.093 63456 12.886 
D 522212.1487 3456  6.618 
C 569451.3099 3456  6.069 
B 821059.4315 2542  3.096 
B 220102.1505 409.39 1.86 
D 103231.5978 345  3.342 
A 88757.39645 345  3.887 
E 300261.0966 345  1.149 
A 213622.291 345  1.615 
B 118701.5504 245  2.064 
D 211678.8321 145  0.685 
B 57798.16514 63  1.09 
E 47619.04762 56  1.176 
C 44191.91919 35  0.792 
B 140186.9159 15  0.107 
A 4288.777698 6  1.399 

所需的輸出(排序並不重要):

media_type seller_revenue imps cpm_calc 
B 22,348,508  18,153,456,955  1.23 
A 5,743,466  2,907,062,569  1.98 
C 66,947   5,538,057   12.09 
D 3,946   837,123    4.71 
E 401    347,880    1.15 
Grand Total 28163268.39 21067242584 1.33682746 

謝謝!

驚訝我還沒有發現這個問題之前用了一個小時的搜索,我不知道它通常不是一個問題?

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

我正在使用MySQL – eastsidelakerfan

回答

0

使用CTE這樣的:

WITH media_type as (
    SELECT old,new from (values 
     ('1', 'A'),('3', 'A'), 
     ('2', 'B'),('4', 'B'), 
     ('5', 'C'),('21','C'),('22','C'), 
     ('7', 'D'),('8', 'D'),('23','D'), 
     ('9', 'E') 
    )media_type(old,new) 
) 
SELECT 
    media_type.new AS media_type, 
    SUM(imp) as imps, 
    SUM(seller_revenue) as seller_revenue, 
    SUM(seller_revenue)/SUM(imp) as CPM 

FROM 
    table 
JOIN media_type on media_type.old = table.media_type 
WHERE 
    dd = '2016-01-19' 

GROUP BY 
    table.media_type 

ORDER BY 
    seller_revenue desc 

LIMIT 100 
1

你沒有提到你正在使用的SQL供應商...

如果你使用的是Oracle,我想你可以使用 WM_CONCAT

對於MySQL,你可以使用 GROUP_CONCAT

(這裏有一個例子:https://www.percona.com/blog/2013/10/22/the-power-of-mysqls-group_concat/

而SQL-Server有一些不可思議的解決方法來達到同樣的效果。

+0

對不起,我正在使用MySQL。 使用group_concat,我相信這可以連接字符串。我期待總結整數。 – eastsidelakerfan

+0

對不起......我誤解了你的問題,我認爲在你想要的輸出中的逗號是由於某種原因的字符串......我不知道爲什麼常規SUM不會做到這一點......是「總計「這行實際上是主要問題?如果是這樣的話......「CUBE」或「ROLLUP」函數可能就是你正在尋找的東西。不幸的是,當涉及到MySQL時,它們非常受限制。 – DougieHauser

+0

不,我會很高興,即使沒有總計 - 這更多的是「很高興有」。看來,即使我正在使用,例如,... CASE 當media_type IN('1','3')THEN'A',... 然後將有一行'1'。 ..被稱爲A ...並且將會有'3'的第二行...也被稱爲'A'。 我試圖在同一行上得到所有的'A'等。 – eastsidelakerfan