C# U-SQL—CASE语句的和

C# U-SQL—CASE语句的和,c#,azure,azure-data-lake,u-sql,C#,Azure,Azure Data Lake,U Sql,我有一个包含客户交易的表,我正试图按客户和部门汇总这些交易 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

我有一个包含客户交易的表,我正试图按客户和部门汇总这些交易

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中,我会这样做:

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文档提到了什么?与C等价,但我不确定如何求和


U-SQL中的等价物是什么?

您可以尝试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

您可以尝试使用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

您甚至可以使用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三元if。

您甚至可以使用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三元if。

您也可以使用U-SQL PIVOT操作符,例如

@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();

有关U-SQL PIVOT的更多信息可用。

您也可以使用U-SQL PIVOT操作符,例如

@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();
有关U-SQL PIVOT的更多信息可用