【问题标题】:I need help on creating columns with aggregations我需要帮助创建具有聚合的列
【发布时间】:2019-01-02 21:38:18
【问题描述】:

以下问题基于下表中的用户有某些事务。请记住,Users 表的主键同时位于 User ID 和 Site ID 列上。

用户

User ID Site ID     Name
1        1          Arthur
2        1          Aaron
2        2          Brett

交易

Transaction ID  User ID Site ID Transaction Type    Transaction Date  Amount
4                  1       1         Sale              1/1/2017         120
6                  1       1         Refund            1/7/2017       -120
7                  2       2         Sale              1/5/2017         90
9                  2       1         Sale              12/1/2016        30
10                 2       1         Sale              1/1/2017         30
11                 2       1         Sale              2/1/2017         30
12                 2       1         Refund            2/7/2017 

   [enter image description here][1]-30

编写一个查询,该查询将返回一个包含以下列的表: 用户 ID、站点 ID、用户名、总销售额、总退款、收取的净额

【问题讨论】:

  • 这看起来很像家庭作业。到目前为止,您尝试过什么?
  • “写一个查询...”听起来像作业。好吧,如果我们为你做这件事,你不会学到很多东西。
  • 同时指定预期结果。并向我们​​展示您当前的查询尝试。
  • 暂时没有为您编写查询,我会使用CASE WHEN 语句来获取我的总和。

标签: sql sql-server


【解决方案1】:

检查下面的查询。

SELECT 
  t.UserId,
  t.SiteId,
  u.Name,
  sum(IIF(transaction_type = 'Sale', 1, 0) * isnull(Amount,0)) totalSales,
  sum(IIF(transaction_type = 'Refund', 1, 0) * isnull(Amount,0)) totalRefunds,
  sum(isnull(amount, 0)) NetAmount
From Transactions t
inner join Users u
  on u.UserId = t.UserId and u.SiteId = t.siteId
Group by
  t.UserId,
  t.SiteId,
  u.Name

【讨论】:

    【解决方案2】:

    您似乎正在寻找条件聚合:

    SELECT
        u.user_id,
        u.site_id,
        u.name,
        SUM(CASE WHEN t.transaction_type = 'Sale' THEN t.amount ELSE 0 END) total_sale,
        SUM(CASE WHEN t.transaction_type = 'Refund' THEN t.amount ELSE 0 END) total_refund,
        SUM(t.amount) total
    FROM
        users AS u
        INNER JOIN transactions AS t
            ON  t.user_id = u.user_id
            AND t.site_id = u.site_id
    GROUP BY
        u.user_id,
        u.site_id,
        u.name
    

    【讨论】:

      【解决方案3】:

      如果这是我的家庭作业问题,我也会加上总分。

      SELECT  
           t.UserID
          ,t.SiteID
          ,u.Name
          ,SUM(CASE WHEN t.TranType = 'Sale' THEN t.Amount ELSE 0 END) AS tsales
          ,SUM(CASE WHEN t.TranType = 'Refund' THEN t.Amount ELSE 0 END) AS trefunds
          ,SUM(t.Amount) AS Total
      FROM Transactions t
      JOIN Users u ON u.SiteID = t.SiteID
                   AND u.UserID = t.UserID
      GROUP BY 
           t.UserID
          ,t.SiteID
          ,u.Name
      UNION
      SELECT  
           999 AS UserId
          ,999 AS SiteID
          ,'TOTALS:' AS [Name]
          ,SUM(CASE WHEN t.TranType = 'Sale' THEN t.Amount ELSE 0 END) AS tsales
          ,SUM(CASE WHEN t.TranType = 'Refund' THEN t.Amount ELSE 0 END) AS trefunds
          ,SUM(t.Amount) AS Total
      FROM Transactions t
      

      这将得到如下所示的结果:

      注意:我没有提前考虑将两个 ID 列设为 Varchar,我的简单解决方法是您看到的 999 以保持我想要的顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        相关资源
        最近更新 更多