[英]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 中的年度结果......
#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.