一尘不染

如何在不使用 group by 的情况下 count() and aggregate 值?

sql

我无法在未通过 group by 子句过滤的情况下获取数据并在选择中对其进行分类。

我有一个表格,其中包含客户满意度调查的结果,其中包括为客户提供服务的办公室、为他提供的服务类型以及客户给出的分数。

我需要知道 NPS 分数并按业务和办公室对它们进行分组。(不包括 ID 列,因为我几乎装不下它,但它就在那里)

service office score
Rental office 1 1
New Cars office 1 6
New Cars office 2 5
Rental office 2 10
Rental office 3 9
New Cars office 3 8

问题是,我需要计算 0 到 6 分(批评者)、7 到 8 分(被动者)以及 9 到 10 分(推荐者)之间的分数。所以它变成了这样:

service office qty_detractors qty_passives qty_promoters qty_answers NPS_score
Rental office 1 1 0 0 1
Rental office 2 0 0 1 1
Rental office 3 0 0 1 1
New Cars office 1 1 0 0 1
New Cars office 2 1 0 1 2
New Cars office 3 0 1 0 2

计算 nps_score = (qty_promoters/qty_answers) - (qty_detractors /qty_answers)

我想过计算分数来获得每个部分的答案总数,但我不知道如何根据我的需要传播数据。

select 
    business,
    office,
    count(score) as total
from dbo.poll_results
group by business,
    office

我考虑制作一个临时表,我可以在其中存储每个答案的 id 并将结果分为 3 个类别。

select id, 
    score, 
    "type" = 
    case
        when score <= 6  then 'detractor'
        when score > 6 and score < 9 then 'passive'
        when score >= 9 then 'promoter'
        end
into #tmp_NPS_scores
from dbo.poll_results

然后加入两者,但我对结果如何感到非常困惑,到目前为止,我一直在尝试构建查询。

我一直在调查PIVOT(),但我相信我仍然不太明白,尝试使用它,但我只得到错误作为回报。我应该追求这个作为解决方案吗?

我希望我能让这个问题尽可能容易理解,我正在处理十多个专栏,我相信这足以让任何人理解。

先感谢您。

哦,以防万一有人想知道,我知道这可以用 BI 工具完成,事实上我需要在 Tableau 中用它制作一个仪表板,但我的任务是通过制作 NPS 来减轻 Tableau 的一些负担表内计算。


阅读 82

收藏
2022-07-21

共1个答案

一尘不染

with breakout as (
    select service, office,
        count(case when score between 0 and 6  then 1 end) as qty_detractors,
        count(case when score between 7 and 8  then 1 end) as qty_passives,
        count(case when score between 9 and 10 then 1 end) as qty_promoters,
        count(*) as qty_answers
    from dbo.poll_results
    group by service, office
)
select *, (qty_promoters - qty_detractors) / qty_answers as NPS_score
from breakout

这将比执行单独的查询并通过连接将它们全部组合然后必须处理有零的空值更有效......

2022-07-21