繁体   English   中英

SSRS 表达式“没有不满意客户的天数”无法正常工作

[英]SSRS Expression “Count of Days with No dissatisfied Customers” Cannot get it working

我必须在我的 SSRS 表中获得一个表达式,以达到没有不满意客户的天数。

现在我有这样的表达:

=RunningValue(IIF(Fields.SATISFACTION_LEVEL,Value <> "Dissatisfied",1,0),Sum, "DataSet1")

这给了我包含不满意以外的满意度的行数。

报告设计

我的问题是,我似乎无法计算没有客户不满意的天数。 我找不到计算日子的解决方案。 本质上这是它应该做的。 如果那天有客户不满意的记录,就不要算了。 如果没有不满意的客户,那就统计一下。

这将需要在今年迄今为止完成,也需要在前一年完成。

我真的很感激这个表达的任何帮助!

谢谢

更新更多信息:

数据集结构是这样的:

_______________________________________
| satisfaction_level     | Date       |
---------------------------------------    
| Satisfied              | 07/20/2020 |
| dissatisfied           | 07/20/2020 |
| Satisfied              | 07/20/2020 |
| Highly Satisfied       | 07/20/2020 |
| Satisfied              | 07/20/2020 |
| Satisfied              | 07/21/2020 |
| Satisfied              | 07/21/2020 |
| Highly Satisfied       | 07/21/2020 |

预期功能 - 2020 年 7 月 20 日当天有 1 位不满意的客户(不统计),2020 年 7 月 21 日当天没有不满意的客户(统计)。 导致总天数没有不满意的客户。 我希望这有助于进一步解释所需的结果。

暂时将 SSRS 放在一边,计算任何事物的天数的问题是很难计算不存在的行。 例如,如果我有许多响应记录分布在一周内,但它们只落在其中的 4 天,当我们按天分组时,查询只能返回记录集中存在的天数的结果:

DECLARE @Responses as Table 
(
    ENTRY_TIME DateTimeOffset, SATISFACTION_LEVEL VARCHAR(20)
)
INSERT INTO @Responses
VALUES 
('2020-01-4', 'Dissatisfied'),
('2020-01-4', 'Dissatisfied'),
('2020-01-1', 'Satisfied'),
('2020-01-5', 'Dissatisfied'),
('2020-01-5', 'Satisfied'),
('2020-01-2', 'Dissatisfied')

SELECT 
  fn.DATE
  , DATENAME(WEEKDAY, fn.DATE) as [Day]
  , SUM(CASE SATISFACTION_LEVEL WHEN 'Dissatisfied' THEN 1 ELSE 0 END) as [Dissatisfied]
FROM @Responses
CROSS APPLY (SELECT CAST(ENTRY_TIME as Date) as [DATE]) as fn
GROUP BY fn.DATE
ORDER BY fn.DATE
DATE       Day                            Dissatisfied
---------- ------------------------------ ------------
2020-01-01 Wednesday                      0
2020-01-02 Thursday                       1
2020-01-04 Saturday                       2
2020-01-05 Sunday                         1

(4 rows affected)

我们可以通过生成一个系列记录集来解决这个问题,我们可以加入我们的真实世界数据,这将确保我们每天都有一行。

这可以通过使用递归 CTE 来实现,在查询下面的分组数据结果中加入系列数据,您可以通过多种不同方式执行此操作,甚至可以对 pivot 的SATISFACTION_LEVEL列响应,这只是为了说明在 SSRS 报告中格式化之前对 SQL 中的数据进行预处理的技术:

DECLARE @From Date = '2019-12-30';
DECLARE @To Date = '2020-01-05';
;
WITH [Sequence] ([Date])
as
(
    SELECT @From
    UNION ALL
    SELECT DATEADD(DAY, 1, [Date]) FROM [Sequence]
    WHERE [Date] < @To 
)
, [GroupedByDay]
as
(
    SELECT 
      fn.DATE
      , SUM(CASE SATISFACTION_LEVEL WHEN 'Dissatisfied' THEN 1 ELSE 0 END) as [Dissatisfied]
      , SUM(CASE SATISFACTION_LEVEL WHEN 'Satisfied' THEN 1 ELSE 0 END) as [Satisfied]
    FROM @Responses
    CROSS APPLY (SELECT CAST(ENTRY_TIME as Date) as [DATE]) as fn
    GROUP BY fn.DATE
)

SELECT 
    c.[Date]
    , DATENAME(WEEKDAY, c.[DATE]) as [Day]
    , ISNull([Dissatisfied],0) as [Dissatisfied]
    , ISNULL([Satisfied],0) as [Satisfied]
FROM [GroupedByDay] g
RIGHT OUTER JOIN [Sequence] c ON g.[DATE] = c.[Date]
ORDER BY c.[Date]
Date       Day                            Dissatisfied Satisfied
---------- ------------------------------ ------------ -----------
2019-12-30 Monday                         0            0
2019-12-31 Tuesday                        0            0
2020-01-01 Wednesday                      0            1
2020-01-02 Thursday                       1            0
2020-01-03 Friday                         0            0
2020-01-04 Saturday                       2            0
2020-01-05 Sunday                         1            1

(7 rows affected)

如果没有有关您的架构和当前查询的特定信息,那是我能提供的最好的信息,但是每天的数据应该足以让您将其分组到 SSRS 中的年度结果......

  • 或者,如果您愿意,也可以直接在 SQL 中进行操作:)

#Update:仅返回没有不满意客户的总天数的示例:

DECLARE @From Date = '2019-12-30';
DECLARE @To Date = '2020-01-05';
;
WITH [Sequence] ([Date])
as
(
    SELECT @From
    UNION ALL
    SELECT DATEADD(DAY, 1, [Date]) FROM [Sequence]
    WHERE [Date] < @To 
)
, [GroupedByDay]
as
(
    SELECT 
      fn.DATE
      , SUM(CASE SATISFACTION_LEVEL WHEN 'Dissatisfied' THEN 1 ELSE 0 END) as [Dissatisfied]
      , SUM(CASE SATISFACTION_LEVEL WHEN 'Satisfied' THEN 1 ELSE 0 END) as [Satisfied]
    FROM @Responses
    CROSS APPLY (SELECT CAST(ENTRY_TIME as Date) as [DATE]) as fn
    GROUP BY fn.DATE
)
, [InjectedMissingDays]
as
(
    SELECT 
        c.[Date]
        , DATENAME(WEEKDAY, c.[DATE]) as [Day]
        , ISNull([Dissatisfied],0) as [Dissatisfied]
        , ISNULL([Satisfied],0) as [Satisfied]
    FROM [GroupedByDay] g
    RIGHT OUTER JOIN [Sequence] c ON g.[DATE] = c.[Date]
)
--Overall 
SELECT COUNT(1) as [Days with No Dissatisfied Customers] FROM [InjectedMissingDays] WHERE Dissatisfied = 0
Days with No Dissatisfied Customers
-----------------------------------
4

(1 row affected)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM