2017-12-06 11 views
-1

Posexplode関数を使用してHiveで完了したSQL Serverでプロセスを作成しようとしています。HiveのPosexplodeと同様のSQL Server機能?

userid sku qty 
1 abc 2427022 3 
2 abc 1883575 1 
3 abc 2427022 3 
4 def 2427022 1 
5 def 1562336 1 
6 def 153842 1 
7 ghi 2427022 3 

ありがとう:私は見えるようにデータをご希望の

userid  sku       qty 
1 abc  2427022      3 
2 abc  1883575|2427022    1|3 
3 def  2427022|1562336|153842  1|1|1 
4 ghi  2427022      3 

は、私は次のようになり、大きなデータセットを持っています!

+1

https://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows – axawire

+1

SOチュートリアルサイトまたはあなたの仕事をする皆さんのプールではありません。代わりに、問題を解決しようとしたコードで特定の質問をしてください。 https://stackoverflow.com/help/how-to-ask –

+0

リンクに加えて、おそらく選択肢にrow_number()を追加して、skuとqtyの正しい値を組み合わせる必要があります同じ行に属しているフィールド。 – axawire

答えて

1

私はそれを理解しました。誰かが2つの区切りの列を区切って同様の問題を抱えている場合は、以下のコードを使用して目的の出力を得ました.Hiveでposexplode関数を使用するのと同じ出力を得るためにSQL ServerのCross Apply関数とXMLを使用しました。

--Create test table 
create table Table1 (userid varchar(max), Sku varchar(max), Qty varchar(max)) 
insert Table1 select 'abc', '2427022' , '3' 
insert Table1 select 'abc', '1883575|2427022', '1|3' 
insert Table1 select 'def', '2427022|1562336|153842' , '1|1|1' 
insert Table1 select 'ghi', '2427022' , ' 3' 


;WITH CTE1 
AS 
(
    SELECT RN= Row_Number() over(Order by userid),userid, 
    Split.a.value('.', 'VARCHAR(100)') AS Sku 
FROM 
(
    SELECT Userid,Sku, 
     CAST ('<M>' + REPLACE(sku, '|', '</M><M>') + '</M>' AS XML) AS Data 
    FROM Table1 
) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) 
) 
,CTE2 
AS 
(
    SELECT RN= Row_Number() over(Order by userid),userid, 
    Split.b.value('.', 'VARCHAR(100)') AS qty 
FROM 
(
    SELECT Userid,qty, 
     CAST ('<M>' + REPLACE(qty, '|', '</M><M>') + '</M>' AS XML) AS Data 
    FROM Table1 
) AS B CROSS APPLY Data.nodes ('/M') AS Split(b) 
) 
Select c.userid, c.Sku, d.qty 
from CTE1 as c 
Inner Join CTE2 as d 
on c.RN =d.RN 
関連する問題