2017-11-03 13 views
1

私は、顧客と部門が集計しようとしている顧客トランザクションを持つテーブルを持っています。 C#同等としてU-SQL - CASE文のSUM

SELECT Cust_id 
     , SUM(CASE WHEN dept = 1 THEN (price * qty) ELSE 0 END) dept_1_spend 
     , SUM(CASE WHEN dept = 2 THEN (price * qty) ELSE 0 END) dept_2_spend 
from tab1 
group by Cust_id 

U-SQLのドキュメントhere言及?を私は値をSUMするかどうかはわかりません。

Cust_id trans_num sku dept qty price 
123   234  345 1  2  15.99 
123   345  887 1  1  12.99 
123   678  445 2  1  21.89 
234   345  998 1  1  7.99 

はSQLで私はこのような何かをしたいです。

U-SQLと同等の機能は何ですか?

答えて

2

あなたは、C#で三項演算子を試すことができます。

SELECT Cust_id 
     , SUM(dept == 1 ? price * qty : 0) AS dept_1_spend 
     , SUM(dept == 2 ? price * qty : 0) AS dept_2_spend 
from tab1 
group by Cust_id 
1

あなたも、SQLのCASE表現を使用することができます。 C#==が必要で、ASを使用して列エイリアスを指定し、キーワードに大文字を使用します。しかし、そうでなければあなたのクエリのように見えます:

@tab1 = 
    SELECT * 
    FROM(
    VALUES 
    (123,234,345,1,2,15.99), 
    (123,345,887,1,1,12.99), 
    (123,678,445,2,1,21.89), 
    (234,345,998,1,1,7.99)) AS T(Cust_id,trans_num,sku,dept,qty,price); 

@res = 
    SELECT Cust_id, 
     SUM(CASE WHEN dept == 1 THEN(price * qty) ELSE 0 END) AS dept_1_spend, 
     SUM(CASE WHEN dept == 2 THEN(price * qty) ELSE 0 END) AS dept_2_spend 
    FROM @tab1 
    GROUP BY Cust_id; 

OUTPUT @res 
TO "/output/sum_case.csv" 
USING Outputters.Csv(); 

私は個人的にはC#の三元が好きです。

2

することもできますU-SQL PIVOTオペレータ、例えばU-SQL PIVOT利用可能here

@tab1 = 
    SELECT * 
    FROM(
    VALUES 
    (123,234,345,1,2,15.99), 
    (123,345,887,1,1,12.99), 
    (123,678,445,2,1,21.89), 
    (234,345,998,1,1,7.99)) AS T(Cust_id,trans_num,sku,dept,qty,price); 


@res = 
    SELECT Cust_id, 
      SUM([1]) AS dept_1_spend, 
      SUM([2]) AS dept_2_spend 
    FROM 
    (
     SELECT Cust_id, dept, price * qty AS spend 
     FROM @tab1 
    ) AS t 
    PIVOT (SUM(spend) FOR dept IN (1 AS [1], 2 AS [2]) 
    ) AS pvt 
    GROUP BY Cust_id; 


OUTPUT @res 
TO "/output/sum_case.csv" 
USING Outputters.Csv(); 

詳しい情報。