【问题标题】:U-SQL - SUM of a CASE StatementU-SQL - CASE 语句的 SUM
【发布时间】:2017-11-03 21:14:05
【问题描述】:

我有一张表,其中包含我试图按客户和部门汇总的客户交易。

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 文档 here 提到 ?C# 等效,但我不确定如何使用 SUM 值。

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

【问题讨论】:

    标签: c# azure azure-data-lake u-sql


    【解决方案1】:

    你可以试试 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
    

    【讨论】:

      【解决方案2】:

      您也可以使用 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 可用here

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多