SQL - добавление счетчика к предложению select - PullRequest
1 голос
/ 09 марта 2012

У меня есть этот запрос, чтобы показать список самых популярных (наиболее популярных) имен на моем сайте:

SELECT name, COUNT(*) AS total_trends
FROM trending_names
WHERE dateTime BETWEEN '"&fromDate&"' AND '"&toDate&"' // -7 days to Now()
GROUP BY name
ORDER BY COUNT(*) DESC
LIMIT 10;

... и вот результаты, которые я печатаю на экране: (цифры представляют количество выполненных поисков)

Angelina Jolie        31,293
Rihanna               26,722
Lindsay Lohan         18,351
Brad Pitt             11,901

Теперь я хотел бы изменить цифры на проценты; поэтому мне действительно нужно получить общее количество всех трендовых имен за последние 7 дней, чтобы вычислить правильный процент.

Есть ли способ добавить общее количество к этому запросу без добавления дополнительного запроса?

Ответы [ 5 ]

3 голосов
/ 09 марта 2012

Вы можете сделать в одном запросе:

Попробуйте ниже:

SELECT name, COUNT(*) AS total_trends,
sum(if(dateTime BETWEEN '"&fromDate&"' AND '"&toDate&"' ,1,0)) as total_last_7_days,
((sum(if(dateTime BETWEEN '"&fromDate&"' AND '"&toDate&"' ,1,0)) /COUNT(*) ) *100)
as percentage                          // if you want to get only percentage
FROM trending_names
GROUP BY name
ORDER BY COUNT(*) DESC
LIMIT 10;
1 голос
/ 09 марта 2012

Я знаю, что вы не используете SQL Server, но некоторым читателям может быть интересно увидеть это компактное решение, которое возможно (SQL Server 2008 или более поздняя версия). Я не уверен, что многие люди знают, что у вас может быть оконный агрегат, который агрегирует агрегат.

select
  name,
  100.0*count(*)/sum(count(*)) over () as pct_trends
from trending_names
where dateTime between getdate()-7 and getdate()
group by name;
1 голос
/ 09 марта 2012

Вы можете использовать подзапрос:

SELECT name, ((COUNT(*)*100)/(SELECT COUNT(*) FROM trending_names))  AS total_trends
FROM trending_names
WHERE dateTime BETWEEN '"&fromDate&"' AND '"&toDate&"' // -7 days to Now()
GROUP BY name
ORDER BY COUNT(*) DESC
LIMIT 10;
0 голосов
/ 09 марта 2012
SELECT name,(total_trends*100.0/sum_total_trends) pct_trends
FROM
(
    SELECT name, COUNT(*) AS total_trends 
    FROM trending_names 
    WHERE dateTime BETWEEN '"&fromDate&"' AND '"&toDate&"' // -7 days to Now() 
    GROUP BY name 
    WITH ROLLUP
) A,
(
    SELECT COUNT(*) AS sum_total_trends 
    FROM trending_names 
    WHERE dateTime BETWEEN '"&fromDate&"' AND '"&toDate&"' // -7 days to Now() 
) B;
0 голосов
/ 09 марта 2012

Нет, я так не думаю.Вам нужно вычислить это общее количество для отдельного (под) выбора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...