2013-03-15 16 views
1

我正在尋找一個查詢,除了一個之外的所有行上執行求和操作。這將是通過下面的例子更清楚..SQL查詢添加所有行的數據,除了

假設我有一個像這樣

Company_name  Rev  order 
    c1    100  1000 
    c2    200  2000 
    c3    300  1500 

公司現在表查詢應插入表喜歡的方式解釋如下:

c1(rev)  c1(order)  sum of other(rev)   other(order) 
    100   1000  500(sum of c2 and c3)  3500(sum of c2 and c3's order) 

這種情況下的查詢會是什麼?

我想查詢:

insert into table_name (c1_rev,c1_order,sum_rev,sum_order) 
select rev, order, sum(rev), sum(order) where Company_name=c1 .... 

但我卡住了,因爲我不能用這個發現另外兩個的總和。

+0

我在找蜂巢。是的,只有三個公司的名稱,我只想要公司名稱c1 – user2122853 2013-03-15 09:19:12

+0

Hive查詢數據使用基於SQL的語言稱爲HiveQL ....所以基本上我想要一個SQL查詢 – user2122853 2013-03-15 09:21:53

+0

這是正常的SQL查詢這樣做: [** SQL Fiddle Demo **](http://sqlfiddle.com/#!2/1d71d/9),不確定如何將它寫入Hive(注意,唯一與MySQL相關的部分是轉義的' ''和'LIMIt'條款) – 2013-03-15 09:29:48

回答

0

在SQL Server中,你可以做這樣的事情來獲取數據:

WITH totals AS 
(SELECT SUM(rev) revSum, SUM(ORDER_) orderSum 
    FROM T) 
SELECT company_name, 
     rev, 
     order_, 
     totals.revsum - rev AS otherRev, 
     totals.orderSum - order_ AS otherOrder 
FROM t, totals 
0

嘗試此查詢:

SELECT Company_name , 
    Rev , 
    ORDER, 
    (SELECT SUM(Rev) FROM table_name k WHERE k.Company_name<>t.Company_name 
)"sum of other(rev)", 
    (SELECT SUM(order) FROM table_name k WHERE k.Company_name<>t.Company_name 
)"other(order)" 
FROM table_name t 
0

沒有組具有將是最好的解決辦法,但HIVE多申」牛逼現在詢問服務它,試試這個:

insert into table table_name 
select rev, order, sumRev, sumOrd 
from (
    select Company_name,rev, order, sum(rev)-rev as sumRev, sum(order) - order as sumOrd from base_table 
) a 
where Company_name='c1' 
0

在蜂巢,查詢類似於:

select sq.cnn,sum(rev),sum(orders) from 
(select if(cn=='c1','c1','other') as cnn, rev,orders from test_cn) sq 
group by sq.cnn; 

將產生2行:

c1  100  1000 
other 500  3500 

不你的輸出完全匹配,但可在您需要的形式提取。

要進行測試,創建一個文本文件與以下內容:

% cat test_cn 
c1|100|1000 
c2|200|2000 
c3|300|3000 

和蜂巢:

hive> drop table if exists test_cn; 
hive> create table test_cn (cn string, rev int, orders int) row format delimited fields terminated by '|' stored as textfile; 
hive> select sq.cnn,sum(rev),sum(orders) from (select if(cn=='c1','c1','other') as cnn, rev,orders from test_cn)sq group by sq.cnn;