【问题标题】:Filter and perform multiple calculations过滤并执行多个计算
【发布时间】:2021-11-05 18:51:30
【问题描述】:

我有一个数据集,我想在其中使用 SQL Server 对两个不同的查询进行分组、过滤和求和。

数据

name    stack   life    date        avail
aa      unused  remove  9/1/2021    5
aa      hi      keep    9/1/2021    1
aa      hey     stay    9/1/2021    1
aa      hey     fix     9/1/2021    2
aa      hey     keep    9/1/2021    4
aa      hi      no      9/1/2021    1
aa      hi      fix     9/1/2021    1
bb      ok      fix     9/1/2021    1
bb      yes     remove  9/1/2021    1
bb      ok      keep    9/1/2021    1
bb      ok      fix     9/1/2021    1
bb      ok      yes     9/1/2021    3
bb      unused  remove  9/1/2021    3
bb      ok      keep    10/1/2021   1

希望 (逻辑)

  1. 按名称分组并过滤到 2021 年 9 月 1 日的日期
  2. WHERE 堆栈!= '未使用'
  3. “保持”和“停留”的生活

+

  1. 按名称分组并过滤到 2021 年 9 月 1 日的日期
  2. WHERE 堆栈!= '未使用'
  3. “保持”生命
  4. 汇总有效性列

输出应该是:

name   date            sum_avail
aa     9/1/2021        11
bb     9/1/2021        2

我尝试过的:

SELECT name, date, SUM(avail) AS sum_avail   
FROM table
(WHERE stack NOT LIKE 'unused' AND WHERE life IN ('keep','stay') AND WHERE date == '9/1/2021')
+
(WHERE stack NOT LIKE 'unused' AND WHERE life IN ('keep') AND WHERE date == '9/1/2021')
GROUP BY name

任何建议都有帮助。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008


    【解决方案1】:

    您可以使用select case statement 来实现此目的。

    select [name], sum(case when life in ('keep','stay') then avail else 0 end) + 
         sum(case when life in ('keep') then avail else 0 end)
    from test
    where date = '9/1/2021' and  stack!='unused'
    group by [name]
    

    见 dbfiddle http://sqlfiddle.com/#!18/6895b/26

    【讨论】:

    • 好的,我会试试这个。谢谢
    • 仅供参考 case 是一个表达式而不是一个语句
    【解决方案2】:
    SELECT name,date, SUM(avail) sum_avail FROM 
    (SELECT * from Table_1 WHERE  stack != 'unused' AND life IN ('keep','stay') AND date='2021-09-01'
    UNION ALL
    SELECT * from Table_1 WHERE  stack != 'unused' AND life IN ('keep') AND date='2021-09-01') A
    GROUP BY name, date
    

    【讨论】:

      【解决方案3】:

      按照逻辑使用单个 SUM() 和多个 case 表达式。按单个日期搜索,然后使用 MAX() 作为日期,但如果需要日期范围搜索,则使用日期列同时选择和按部分分组。

      -- SQL Server (v2017)
      SELECT name, MAX(date) "date"
           , SUM(CASE WHEN life IN ('keep','stay') THEN avail ELSE 0 END
                 +
                 CASE WHEN life = 'keep' THEN avail ELSE 0 END) sum_avail
      FROM test_tbl
      WHERE date = '9/1/2021'
          AND stack != 'unused'
      GROUP BY name;
      

      请查看网址https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=98f4dcee17dfe8c54edf7ab3e6fed561

      【讨论】:

        【解决方案4】:
        SELECT [name]
              ,[date]
              ,SUM(avail) as sum_avail FROM 
        (SELECT * from Test WHERE life IN ('keep','stay')
        UNION ALL
        SELECT * from Test WHERE life IN ('keep') ) as Test1 
        WHERE  stack != 'unused' AND date='2021-01-09'
        GROUP BY [name],[date]
        

        【讨论】:

        • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
        • 好的,我将在今天晚些时候提供更多详细信息,谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 2019-12-19
        • 1970-01-01
        • 2021-01-13
        • 2021-01-30
        相关资源
        最近更新 更多