AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 278830
Accepted
TheDemonLord
TheDemonLord
Asked: 2020-10-29 13:31:27 +0800 CST2020-10-29 13:31:27 +0800 CST 2020-10-29 13:31:27 +0800 CST

使用 NULL 的开始日期和结束日期计算分组记录

  • 772

这是我的问题,源数据库是 Azure MSSQL - 我有一张表,列出了所有已售出的订阅。相关列是:

账号、订阅组、购买日期、取消日期

取消日期包含 NULL 值(对于尚未取消的订阅)。一个帐户可能有多个订阅,跨越多个订阅组。

样本数据为:

帐号 | 订阅群 | 购买日期 | 取消日期 |

1 | 一个 | 2013 年 2 月 4 日 | 2014 年 2 月 4 日 |
1 | 一个 | 2013 年 2 月 4 日 | 空 |
1 | 乙| 2013 年 2 月 4 日 | 空 |
2 | C | 2018 年 5 月 7 日 | 2020 年 5 月 8 日 |
3 | C | 20/3/2020 | 空 |
3 | C | 2020 年 4 月 8 日 | 空 |

等等。

我正在计算每个客户和每个月的订阅组数量 - 所以输出看起来像这样:

客户 | A 的计数 | B 的计数 | C 计数 | 月/年 |
1 | 1 | 1 | 0 | 2020 年 10 月 |
3 | 0 | 0 | 2 | 2020 年 10 月 |
1 | 1 | 1 | 0 | 09/2020 |
3 | 0 | 0 | 2 | 09/2020 |
1 | 1 | 1 | 0 | 08/2020 |
2 | 0 | 0 | 1 | 08/2020 |
3 | 0 | 0 | 2 | 08/2020 |

我可以为给定月份编写查询:

select t.[account number],
COUNT(CASE WHEN t.[Subscription group] = A then 1 ELSE NULL END) as "Count of A",
COUNT(CASE WHEN t.[Subscription group] = B then 1 ELSE NULL END ) 作为 "Count of B",
COUNT(CASE WHEN t.[Subscription group] = C then 1 ELSE NULL END) as "Count of C",
'09/2020' as 'Month/Year'
from table t
where (t .[Purchase Date] <= '30/09/2020' and (t.[Cancellation Date] is null or t.[Cancellation Date] > '01/10/2020') )
按 t.[Account Number] 分组, [月/年]

但是,我希望有人可以帮助我修改上述内容,以便它将运行所有月份(基于购买日期的 MIN 和取消日期的 MAX)

sql-server azure-sql-database
  • 1 1 个回答
  • 87 Views

1 个回答

  • Voted
  1. Best Answer
    TheDemonLord
    2020-11-02T15:34:37+08:002020-11-02T15:34:37+08:00

    我最终使用存储过程执行此操作,创建了一个临时表:

    DECLARE @StartDate  DATE,
            @EndDate    DATE;
    
    SELECT   @StartDate = (select min([purchase date]) from Table where [Purchase Date] != '1970-01-01')      
             ,@EndDate  = (select max([Cancellation date]) from Table);
    
    
    ;with months (date)
    AS
    (
        SELECT @startdate
        UNION ALL
        SELECT DATEADD(month, 1, date)
        from months
        where DATEADD(month, 1, date) < @enddate
    )
    select     IDENTITY(int, 1, 1)  as ID,
               [LastDayOfMonth]  = EOMONTH(date),
               [FirstDayOfNextMonth] = DATEADD(DAY, 1, EOMONTH(date)),
               [date] = date
    into #tempdatetable
    from months
    option (maxrecursion 0)
    

    然后通过该表执行循环并填充输出表:

    Declare @Id int
    Declare @ldom date
    declare @fdonm date
    declare @my date
    
    While (Select Count(*) From #tempdatetable) > 0
    Begin
    
        Select Top 1 @Id = Id,
        @ldom = LastDayOfMonth,
        @fdonm = FirstDayOfNextMonth,
        @my = [date]
        From #tempdatetable
    
    insert into MyOutputTable (Customer,
    [Count of A],
    [Count of B],
    [Count of C],
    [Month/Year])
    select T.[Customer],
    COUNT(CASE WHEN T.[Subscription group] = 1 then 1 ELSE NULL END) as "Count of A",
    COUNT(CASE WHEN T.[Subscription group] = 2 then 1 ELSE NULL END) as "Count of B",
    COUNT(CASE WHEN T.[Subscription group] = 3 then 1 ELSE NULL END) as "Count of C",
    @my as 'Month/Year'
    from Table T
    where ((T.[Purchase Date] <= @ldom or T.[Purchase Date] is null) and (T.[Cancellation date] is null or T.[Cancellation date] > @fdonm) )
    Group by T.[Customer]
    
    Delete #tempdatetable Where Id = @Id
    
    End
    
    drop table #tempdatetable
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve