【问题标题】:Return SQL results with Percent返回带有百分比的 SQL 结果
【发布时间】:2020-12-13 09:32:52
【问题描述】:

我有以下查询以及返回数据中结果集所需的计数,例如 25%。

我在尝试运行查询时不断收到以下错误:

无法对包含聚合或子查询的表达式执行聚合函数。

SELECT * from
(SELECT 
    l.Title as List
,   CASE 
        WHEN _Custom57 between 13 and 17 THEN '17 and under' 
        WHEN _Custom57 between 18 and 24 THEN '18-24' 
        WHEN _Custom57 between 25 and 34 THEN '25-34' 
        WHEN _Custom57 between 35 and 44 THEN '35-44' 
        WHEN _Custom57 between 45 and 54 THEN '45-54' 
        WHEN _Custom57 >= 55 THEN '55-64' 
        WHEN _Custom57 >= 65 THEN '65+' 
    END as age
    , CAST(Round(count(r.RecipID) * 100.0 / sum(count(*)), 0) as nvarchar(5)) + '%' as RecipCount
FROM MailingRecips mr (NOLOCK)
INNER JOIN Lists l (NOLOCK)
    on mr.ListID = l.ListID
INNER JOIN Recips r (NOLOCK)
    on mr.RecipID = r.RecipID
INNER JOIN RecipsAdditional ra (NOLOCK)
    on r.RecipID = ra.RecipID
WHERE mr.QueueTime >= dbo.UNIX_TIMESTAMP(DATEADD(d, -1, DATEDIFF(d, 0, GETDATE()))) and mr.QueueTime < dbo.UNIX_TIMESTAMP(DATEADD(d, 0, DATEDIFF(d, 0, GETDATE())))
AND mr.ListID IN (
12388,  
12390,  
12412,  
12413,  
12414,  
12429,  
12462,  
12514,
12572 
)
GROUP BY l.Title,   
CASE 
        WHEN _Custom57 between 13 and 17 THEN '17 and under' 
        WHEN _Custom57 between 18 and 24 THEN '18-24' 
        WHEN _Custom57 between 25 and 34 THEN '25-34' 
        WHEN _Custom57 between 35 and 44 THEN '35-44' 
        WHEN _Custom57 between 45 and 54 THEN '45-54' 
        WHEN _Custom57 >= 55 THEN '55-64' 
        WHEN _Custom57 >= 65 THEN '65+' 
    END 
)t
PIVOT (
sum(RecipCount) for age in ([17 and under],[18-24],[25-34],[35-44],[45-54],[55-64],[65+])
) as PVT

【问题讨论】:

  • 停止使用nolock hints 溅射您的代码。但如果你确实需要它们,至少不要使用不推荐使用的语法。

标签: sql-server percentage


【解决方案1】:

我认为有两个问题:

请先使用最大值,否则所有 65+ 也将归入 55-64 类别。

CASE 
        WHEN _Custom57 >= 65 THEN '65+'
        WHEN _Custom57 >= 55 THEN '55-64' 
        WHEN _Custom57 between 13 and 17 THEN '17 and under' 
        WHEN _Custom57 between 18 and 24 THEN '18-24' 
        WHEN _Custom57 between 25 and 34 THEN '25-34' 
        WHEN _Custom57 between 35 and 44 THEN '35-44' 
        WHEN _Custom57 between 45 and 54 THEN '45-54' 
    END as age

请在以下行中仅使用count(*)

 , CAST(Round(count(r.RecipID) * 100.0 / count(*), 0) as nvarchar(5)) + '%' as RecipCount

【讨论】:

  • 当改为count(*)时,尝试运行查询“Operand data type nvarchar is invalid for sum operator”时抛出以下错误。
  • @SM 或者请像 cast(RecipCount AS int) 一样在枢轴内投射 RecipCount。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多