#sql-server #percentage
#sql-server #процент
Вопрос:
У меня есть следующий запрос с количеством, необходимым для возврата результирующего набора данных, например 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
Комментарии:
1. Прекратите разбрызгивать свой код с помощью подсказок nolock . Но если они вам действительно нужны, по крайней мере, не используйте устаревший синтаксис.
Ответ №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
Комментарии:
1. При изменении на count (*) при попытке выполнить запрос выдается следующая ошибка «Тип данных операнда nvarchar недопустим для оператора sum».
2. @SMor пожалуйста, приведите RecipCount также внутри pivot, как приведение (RecipCount КАК int).