2014-12-04 40 views
0

我通常不會做數據庫編程,所以在生產某些東西時生疏了。但是,我有一個問題,即我要購買一件商品,如果此商品處於同一地點但處於不同展示位置,請將該商品的價值除以展示位置之間的總計數。SQL - 在行之間劃分值的函數

這裏是我的表結構:

LOCATION PLACEMENT VALUE COUNT ITEM 
25   12345  100 10  55555 <---- 
25   67890  100 20  55555 <---- 
25   11111  50  5  00000 
25   22222  75  5  11111 

換句話說Item (55555)是2個展示位置和這個項目的價值100

新的值應爲:PLACEMENT 12345會(10/30 )* 100 = 33.3和PLACEMENT 67890將是(20/30)* 100 = 66.7

任何想法如何在SQL或HQL中做到這一點?

+0

它實際上20第二排...遺憾的錯誤,但我沒有,我需要根據具有相同項目的行之間的總計數除以100 – 2014-12-04 19:19:14

回答

3
create table new as 
select item,count(distinct placement) as dist_placement,count(count)as count,sum(count) as s_count 
from mytable 
group by item,location; 

hive> select * from new; 
OK 
00000 1 1 5 
11111 1 1 5 
55555 2 2 30 



Create table final as 
select b.location as location,b.placement as placement, CASE 
WHEN a.count=2 and a.dist_placement=2 then cast(((b.count/a.s_count)*b.value) as double) 
ELSE cast(b.value as double) 
END , b.count as count, b.item as item 
from new a 
join mytable b 
on a.item=b.item; 

select * from final; 

輸出

location placement value    count item 
    25  12345 33.33333333333333 10  55555 
    25  67890 66.66666666666666 20  55555 
    25  11111 50.0     5  00000 
    25  22222 75.0     5  11111 

,如果你給人以相同的位置和不同的項目輸入

LOCATION PLACEMENT VALUE COUNT ITEM 
25   12345  100 10  55555 <---- 
25   12345  100 20  55555 <---- 
25   11111  50  5  00000 
25   22222  75  5  11111 

輸出將是

LOCATION PLACEMENT VALUE COUNT ITEM 
    25  12345  100.0 10 55555 
    25  12345  100.0 20 55555 
    25  11111  50.0 5 00000 
    25  22222  75.0 5 11111 

我可以對,如果您有其他要求,請告訴我。

+0

添加此初始工作很好。不得不稍微調整一下。我注意到你做了'count and placement = 2'。我應該說有2個或更多。 – 2014-12-05 16:04:42

+0

有沒有辦法來SUM值列?當我嘗試在計算中使用總和函數時,我得到「尚未支持UDAF的地方」SUM「 – 2014-12-05 18:03:22

+0

當您在這種情況下您的計數和位置> 2時,您只需更改,當a.count> 1和a。 dist_placement> 1在查詢中,它將工作。 – 2014-12-06 04:31:30

1

可能有更高效的方式來做到這一點,但是在兩個步驟中,您可以將item_count加起來,然後通過分割來創建新值。

create table new as select 
item, sum(count) as item_count 
from old 
group by item, location, placement; 

create table new2 as select 
a.*, 
b.item_count, 
a.count/b.item_count as new_count 
from old a 
left join new b 
on a.item=b.item; 
1

你的樣品臺

SELECT * INTO #TEMP FROM 
(
     SELECT 25 LOCATION,12345 PLACEMENT,100 VALUE ,10 [COUNT], 55555 ITEM 
     UNION ALL 
     SELECT 25 ,  67890 ,  100 , 20,55555 
     UNION ALL 
     SELECT 25 ,  11111 ,  50 , 5,00000 
     UNION ALL 
     SELECT 25 ,  22222 ,  75 , 5, 11111 
)TAB 

您的結果低於

SELECT *, 
CAST(([COUNT]/CAST(SUM([COUNT]) OVER(PARTITION BY ITEM)AS NUMERIC(20,2)))*VALUE AS NUMERIC(20,1)) Result 
FROM #TEMP 

enter image description here