我正在寻找一个对除了一行之外的所有行执行求和运算的查询。下面的例子将会更清楚。
假设我有这样的公司表
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 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
没有Group By将是最好的解决方案,但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'
答案 3 :(得分:0)
在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;
将生成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;