【问题标题】:Date counts to be display in specific conditions in the stored proc like [0-6 days],[7-14 days] etc日期计数将在存储过程中的特定条件下显示,例如 [0-6 天]、[7-14 天] 等
【发布时间】:2019-12-04 13:40:55
【问题描述】:

我正在创建一个 ssrs 报告和 SP。所以我有下面这样的要求。 我有一个名为 management 的表,因为我们有一个列描述,所以下面的数据 描述只有“打开”和“关闭”。

我有一个名为用户、开始日期和结束日期的参数

我需要显示所有具有在开始日期和开始日期之间的未结案件计数的用户 以下条件下的结束日期。 条件是 0-5天 6-11 天 12-18 天。

例如: 如果我输入开始日期(MM/DD/YYYY)为 12-1-2019,结束日期为 12-31-2019 所以我需要显示在 0-5 天、6-11 天和 12-18 天之间有未结案件数的用户。

【问题讨论】:

  • 样本数据和预期结果将帮助我们帮助您,以及您的尝试。
  • 我在下面有这样的数据 1)我必须显示在上面提到的指定日期条件下有未结案件的用户用户 user1 等 2)我有一个表格管理,在描述列下我有如下数据 描述 ----------- 打开关闭 打开打开关闭 预期结果就像选择 2019-12-01 作为 sd 和 2019-12-31 我可能会得到一个日期低于 0 的用户-6 天,然后我们需要将其显示为计数 1 下 0-6 天(打开)用户 0-5 天 6-11 天 user1 2 1 user2 1 2
  • 数据完整无济于事。将 consumable 数据放入您的问题中。
  • 其实我想像下面用户 0-5 天 6-11 天 12-18 天 ---- ------- ------- ------- User1 2 1 3 User2 1 4 2 User3 5 0 1 说明:用户 1 在 0-5 天之间有 2 个未结案件意味着当我进入日期范围时考虑 2019-01-01 和 2019-31-01 所以我在第一个 0 之间有 2 个未结案件-5 天(2019-01-01 和 2019-05-01)以及接下来 6-11 天(2019-06-01 和 2019-11-01)之间的 1 个未结案件等。我可以这样吗?

标签: sql-server stored-procedures reporting-services


【解决方案1】:

这样的事情怎么样?

select   [0-5] = SUM(IIF(DATEDIFF(day,OpenDate, CloseDate) >= 0 and DATEDIFF(day,OpenDate, CloseDate) <= 5,1,0))
        ,[6-11] = SUM(IIF(DATEDIFF(day,OpenDate, CloseDate) >= 6 and DATEDIFF(day,OpenDate, CloseDate) <= 11,1,0))
        ,[12-18] = SUM(IIF(DATEDIFF(day,OpenDate, CloseDate) >= 12 and DATEDIFF(day,OpenDate, CloseDate) <= 18,1,0))
from tblOpenClose

【讨论】:

    【解决方案2】:

    带有一点条件聚合。
    结合范围的交叉应用。

    SELECT t.UserId, a.DateDiffRange
    , COUNT(CASE WHEN t.Description LIKE 'Open%' THEN 1 END) AS [Open]
    , COUNT(CASE WHEN t.Description LIKE 'Closed%' THEN 1 END) AS [Closed]
    , COUNT(*) AS [Total]
    FROM management AS t
    CROSS APPLY
    (
      SELECT 
      (CASE 
       WHEN DATEDIFF(day, t.[Start Date], t.[End Date]) BETWEEN 0 AND 5 THEN '00-05'
       WHEN DATEDIFF(day, t.[Start Date], t.[End Date]) BETWEEN 6 AND 11 THEN '06-11'
       WHEN DATEDIFF(day, t.[Start Date], t.[End Date]) BETWEEN 12 AND 18 THEN '12-18'
       WHEN DATEDIFF(day, t.[Start Date], t.[End Date]) BETWEEN 19 AND 30 THEN '19-30'
       END) AS DateDiffRange
    ) AS a
    WHERE t.[Start Date] >= CAST('2019-12-01' AS DATE)
      AND t.[End Date] BETWEEN t.[Start Date] AND EOMONTH(t.[Start Date])
    GROUP BY YEAR(t.[Start Date]), MONTH(t.[Start Date]), t.UserId, a.DateDiffRange
    ORDER BY t.UserId, a.DateDiffRange;
    

    对于每位用户的更多指标?
    看看这个以获得灵感:

    SELECT (YEAR(t.[Start Date])*100+MONTH(t.[Start Date])) AS YearMonth, t.UserId
    , SUM(CASE WHEN a.DateDiff BETWEEN 0 AND 5 THEN a.IsOpen END) AS [Opened Within 0-5]
    , SUM(CASE WHEN a.DateDiff BETWEEN 6 AND 11 THEN a.IsOpen END) AS [Opened Within 6-11]
    , SUM(CASE WHEN a.DateDiff BETWEEN 12 AND 18 THEN a.IsOpen END) AS [Opened Within 12-18]
    , SUM(CASE WHEN a.DateDiff BETWEEN 19 AND 30 THEN a.IsOpen END) AS [Opened Within 19-30]
    
    , SUM(CASE WHEN a.DateDiff BETWEEN 0 AND 5 THEN a.IsClosed END) AS [Closed Within 0-5]
    , SUM(CASE WHEN a.DateDiff BETWEEN 6 AND 11 THEN a.IsClosed END) AS [Closed Within 6-11]
    , SUM(CASE WHEN a.DateDiff BETWEEN 12 AND 18 THEN a.IsClosed END) AS [Closed Within 12-18]
    , SUM(CASE WHEN a.DateDiff BETWEEN 19 AND 30 THEN a.IsClosed END) AS [Closed Within 19-30]
    
    , SUM(CASE WHEN DAY(t.[Start Date]) BETWEEN 1 AND 5 THEN a.IsOpen END) AS [Opened Start 1-5]
    , SUM(CASE WHEN DAY(t.[Start Date]) BETWEEN 6 AND 11 THEN a.IsOpen END) AS [Opened Start 6-11]
    , SUM(CASE WHEN DAY(t.[Start Date]) BETWEEN 12 AND 18 THEN a.IsOpen END) AS [Opened Start 12-18]
    , SUM(CASE WHEN DAY(t.[Start Date]) BETWEEN 19 AND 30 THEN a.IsOpen END) AS [Opened Start 19-31]
    
    , SUM(CASE WHEN DAY(t.[Start Date]) BETWEEN 1 AND 5 THEN a.IsClosed END) AS [Closed Start 0-5]
    , SUM(CASE WHEN DAY(t.[Start Date]) BETWEEN 6 AND 11 THEN a.IsClosed END) AS [Closed Start 6-11]
    , SUM(CASE WHEN DAY(t.[Start Date]) BETWEEN 12 AND 18 THEN a.IsClosed END) AS [Closed Start 12-18]
    , SUM(CASE WHEN DAY(t.[Start Date]) BETWEEN 19 AND 31 THEN a.IsClosed END) AS [Closed Start 19-31]
    
    , COUNT(*) AS [Total]
    FROM management AS t
    CROSS APPLY
    (
      SELECT 
      DATEDIFF(day, t.[Start Date], t.[End Date]) AS [DateDiff],
      CASE WHEN t.Description LIKE 'Open%' THEN 1 END AS [IsOpen],
      CASE WHEN t.Description LIKE 'Closed%' THEN 1 END AS [IsClosed]
    ) AS a
    WHERE t.[Start Date] >= CAST('2019-12-01' AS DATE)
      AND t.[End Date] BETWEEN t.[Start Date] AND EOMONTH(t.[Start Date])
    GROUP BY YEAR(t.[Start Date]), MONTH(t.[Start Date]), t.UserId
    ORDER BY YearMonth, t.UserId;
    
    年月 |用户名 | 0-5 内开盘 | 6-11 内开业 | 12-18 内开业 | 19-30 内开业 | 0-5 内关闭 | 6-11 内关闭 | 12-18 内关闭 | 19-30 内关闭 |开始 1-5 |开始 6-11 |开始 12-18 | 19-31 开始 |关闭开始 0-5 | 6-11 关闭开始 |关闭开始 12-18 |关闭开始 19-31 |全部的 --------: | -----: | ----------------: | -----------------: | ------------------: | ------------------: | ----------------: | -----------------: | ------------------: | ------------------: | ---------------: | ----------------: | -----------------: | -----------------: | ---------------: | ----------------: | -----------------: | -----------------: | ----: 201912 | 101 | 4 | 4 | 3 | 1 | | 1 | 3 | 1 | 10 | | 2 | | 5 | | | | 17 201912 | 102 | 3 | 2 | | | | | | | 5 | | | | | | | | 5

    测试 dbfiddle here

    【讨论】:

    • 嗨 LukStorms,实际上这是正确的答案,但我可以像下面这样得到它用户 0-5days 6-11days 12-18days ------ -------- ----- -- ------- User1 2 1 3 User2 1 4 2 User3 5 0 1 说明:用户 1 在 0-5 天之间有 2 个未结案件意味着当我进入日期范围时考虑 2019-01-01 和 2019-31 -01 所以我在前 0-5 天(2019-01-01 和 2019-05-01)之间有 2 个未结案件,在接下来的 6-11 天(2019-06-01 和 2019-11-01)之间有 1 个未结案件等等,对于 user1,就像对于 user2 和 user3 一样。我可以这样吗?
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多