Sql 按功能分组,除以总数

Sql 按功能分组,除以总数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想在下面的代码中为我的每一列添加%的总计,但由于SELECT语句已经被GROUPBY过滤,我无法理解它 SELECT CCK_DIALEDTHEME AS 'Theme', COUNT(TA_TASKID) AS 'Total Calls Incoming', COUNT(CASE WHEN TM_SPEECH > 0 THEN TA_TASKID END) AS 'Total Answered Calls', COUNT(CASE WHEN T

我想在下面的代码中为我的每一列添加%的总计,但由于SELECT语句已经被GROUPBY过滤,我无法理解它

SELECT CCK_DIALEDTHEME AS 'Theme',
       COUNT(TA_TASKID) AS 'Total Calls Incoming',
       COUNT(CASE WHEN TM_SPEECH > 0 THEN TA_TASKID END) AS 'Total Answered Calls',
       COUNT(CASE WHEN TM_SPEECH = 0 THEN TA_TASKID END) AS 'Total Lost Calls'
  FROM [BSIT_ERA_RAW_DATA].[dbo].[IPOCC_LEVELONEDATA]
  WHERE TA_TIMESTAMP >= dateadd(day,-1, cast(getdate() as date)) AND TA_TIMESTAMP <= dateadd(day,0, cast(getdate() as date))
        AND CCK_ROUTEDTHEME LIKE '%_T'
        AND TA_CONNECTIONSTATE LIKE '%QUEUE%'
  GROUP BY CCK_DIALEDTHEME

UNION ALL

SELECT 'Total' AS 'Theme',
       COUNT(TA_TASKID) AS 'Total Calls Incoming',
       COUNT(CASE WHEN TM_SPEECH > 0 THEN TA_TASKID END) AS 'Total Answered Calls',
       COUNT(CASE WHEN TM_SPEECH = 0 THEN TA_TASKID END) AS 'Total Lost Calls'
  FROM [BSIT_ERA_RAW_DATA].[dbo].[IPOCC_LEVELONEDATA]
  WHERE TA_TIMESTAMP >= dateadd(day,-1, cast(getdate() as date)) AND TA_TIMESTAMP <= dateadd(day,0, cast(getdate() as date))
        AND CCK_ROUTEDTHEME LIKE '%_T'
        AND TA_CONNECTIONSTATE LIKE '%QUEUE%'
我想要这样的东西:

     Theme              Total Calls Incoming  VS Total%     Total Answered Calls  VS Total%   Total Lost Calls  VS Total%
     Adelaide_T         109                   5.48%         103                   5.40%       6                 7.23%
干杯

用总和来计算总数。然后计算每行的百分比。myTable应替换为您的查询

select
    Theme, [Total Calls Incoming]
    , [VS Total%] = cast(cast(100.0 *[Total Calls Incoming] / sum([Total Calls Incoming]) over () as decimal(20, 2)) as varchar(25)) + '%'
    , [Total Answered Calls]
    , [VS Total%] = cast(cast(100.0 *[Total Answered Calls] / sum([Total Answered Calls]) over () as decimal(20, 2)) as varchar(25)) + '%'
    , [Total Lost Calls]
    , [VS Total%] = cast(cast(100.0 *[Total Lost Calls] / sum([Total Lost Calls]) over () as decimal(20, 2)) as varchar(25)) + '%'
from
    myTable
以下是查询的外观:

SELECT
    Theme, [Total Calls Incoming]
    , [VS Total%] = cast(cast(100.0 *[Total Calls Incoming] / (sum([Total Calls Incoming]) over () / 2) as decimal(20, 2)) as varchar(25)) + '%'
    , [Total Answered Calls]
    , [VS Total%] = cast(cast(100.0 *[Total Answered Calls] / (sum([Total Answered Calls]) over () / 2) as decimal(20, 2)) as varchar(25)) + '%'
    , [Total Lost Calls]
    , [VS Total%] = cast(cast(100.0 *[Total Lost Calls] / (sum([Total Lost Calls]) over () / 2) as decimal(20, 2)) as varchar(25)) + '%'
FROM (
    SELECT
        ISNULL(CCK_DIALEDTHEME, 'Total') AS 'Theme',
        COUNT(TA_TASKID) AS 'Total Calls Incoming',
        COUNT(CASE WHEN TM_SPEECH > 0 THEN TA_TASKID END) AS 'Total Answered Calls',
        COUNT(CASE WHEN TM_SPEECH = 0 THEN TA_TASKID END) AS 'Total Lost Calls'
    FROM 
        [BSIT_ERA_RAW_DATA].[dbo].[IPOCC_LEVELONEDATA]
    WHERE 
        TA_TIMESTAMP >= dateadd(day,-1, cast(getdate() as date)) AND TA_TIMESTAMP <= dateadd(day,0, cast(getdate() as date))
        AND CCK_ROUTEDTHEME LIKE '%_T'
        AND TA_CONNECTIONSTATE LIKE '%QUEUE%'
    GROUP BY GROUPING SETS (CCK_DIALEDTHEME, ())
) T
使用sum over查找总数。然后计算每行的百分比。myTable应替换为您的查询

select
    Theme, [Total Calls Incoming]
    , [VS Total%] = cast(cast(100.0 *[Total Calls Incoming] / sum([Total Calls Incoming]) over () as decimal(20, 2)) as varchar(25)) + '%'
    , [Total Answered Calls]
    , [VS Total%] = cast(cast(100.0 *[Total Answered Calls] / sum([Total Answered Calls]) over () as decimal(20, 2)) as varchar(25)) + '%'
    , [Total Lost Calls]
    , [VS Total%] = cast(cast(100.0 *[Total Lost Calls] / sum([Total Lost Calls]) over () as decimal(20, 2)) as varchar(25)) + '%'
from
    myTable
以下是查询的外观:

SELECT
    Theme, [Total Calls Incoming]
    , [VS Total%] = cast(cast(100.0 *[Total Calls Incoming] / (sum([Total Calls Incoming]) over () / 2) as decimal(20, 2)) as varchar(25)) + '%'
    , [Total Answered Calls]
    , [VS Total%] = cast(cast(100.0 *[Total Answered Calls] / (sum([Total Answered Calls]) over () / 2) as decimal(20, 2)) as varchar(25)) + '%'
    , [Total Lost Calls]
    , [VS Total%] = cast(cast(100.0 *[Total Lost Calls] / (sum([Total Lost Calls]) over () / 2) as decimal(20, 2)) as varchar(25)) + '%'
FROM (
    SELECT
        ISNULL(CCK_DIALEDTHEME, 'Total') AS 'Theme',
        COUNT(TA_TASKID) AS 'Total Calls Incoming',
        COUNT(CASE WHEN TM_SPEECH > 0 THEN TA_TASKID END) AS 'Total Answered Calls',
        COUNT(CASE WHEN TM_SPEECH = 0 THEN TA_TASKID END) AS 'Total Lost Calls'
    FROM 
        [BSIT_ERA_RAW_DATA].[dbo].[IPOCC_LEVELONEDATA]
    WHERE 
        TA_TIMESTAMP >= dateadd(day,-1, cast(getdate() as date)) AND TA_TIMESTAMP <= dateadd(day,0, cast(getdate() as date))
        AND CCK_ROUTEDTHEME LIKE '%_T'
        AND TA_CONNECTIONSTATE LIKE '%QUEUE%'
    GROUP BY GROUPING SETS (CCK_DIALEDTHEME, ())
) T

我修改了代码,对总值进行子查询,以计算出每个主题占总值的百分比,如下示例之一:

SELECT CCK_DIALEDTHEME AS 'Theme',
       COUNT(TA_TASKID) AS 'Total Calls Incoming',
       STR(((100.00* 
       (COUNT(TA_TASKID))) 
       / 
       (SELECT COUNT(TA_TASKID) 
         FROM [BSIT_ERA_RAW_DATA].[dbo].[IPOCC_LEVELONEDATA]
         WHERE TA_TIMESTAMP >= dateadd(day,-1, cast(getdate() as date)) AND TA_TIMESTAMP <= dateadd(day,0, cast(getdate() as date))
         AND CCK_ROUTEDTHEME LIKE '%_T'
         AND TA_CONNECTIONSTATE LIKE '%QUEUE%')),5,2) AS '% Total'

我修改了代码,对总值进行子查询,以计算出每个主题占总值的百分比,如下示例之一:

SELECT CCK_DIALEDTHEME AS 'Theme',
       COUNT(TA_TASKID) AS 'Total Calls Incoming',
       STR(((100.00* 
       (COUNT(TA_TASKID))) 
       / 
       (SELECT COUNT(TA_TASKID) 
         FROM [BSIT_ERA_RAW_DATA].[dbo].[IPOCC_LEVELONEDATA]
         WHERE TA_TIMESTAMP >= dateadd(day,-1, cast(getdate() as date)) AND TA_TIMESTAMP <= dateadd(day,0, cast(getdate() as date))
         AND CCK_ROUTEDTHEME LIKE '%_T'
         AND TA_CONNECTIONSTATE LIKE '%QUEUE%')),5,2) AS '% Total'

应该能够使用AVG OVER window函数HI All,显然我可以在SELECT语句中使用子查询来获得总计,并计算出每列总计的百分比。谢谢你的回复!应该能够使用AVG OVER window函数HI All,显然我可以在SELECT语句中使用子查询来获得总计,并计算出每列总计的百分比。谢谢你的回复!我相信这会抛出一个错误,因为[Total Calls Incoming]是一个别名,而不是一个别名column@DanBracuk,是的,他的查询中的别名必须替换myTable。我在报纸上说的answer@uzi,谢谢你,我已经发布了类似的答案,这些答案对我的案件有效。@AlvinWi,这也会有效。但是,如果以这种方式单独计算总计,您可能会遇到性能问题。我相信这会引发错误,因为[Total Calls Incoming]是一个别名,而不是一个别名column@DanBracuk,是的,他的查询中的别名必须替换myTable。我在报纸上说的answer@uzi,谢谢你,我已经发布了类似的答案,这些答案对我的案件有效。@AlvinWi,这也会有效。但是,如果以这种方式单独计算总数,可能会出现性能问题