SQL Server запрос статистики - PullRequest
1 голос
/ 03 ноября 2010

У меня есть таблица со следующими столбцами

source_title, country, language, source_url

Мне нужно сгенерировать запрос, который даст мне следующее:

country, source_title count, percentage of sources

и

language, source_title count, percentage of sources

в основном сопоставляют страну со всеми источниками и получают количество и проценты этого сопоставления

, а не данные уровня строки, такие как

SELECT [source_id]
  ,[source_title]
  ,[source_url]
  ,[moreover]
  ,[country]
  ,[lang]
FROM [NewsDatabase].[dbo].[NewsSourcesMatch]
order by country

Например, если имеется 10 записей, где страна - СШАзатем

country    count(source_title)   % source_title
USA            10                    10/1000 * 100

извините, все здесь представляют пример данных

source_title source_url, более того страна lang

Hadeland http://www.hadeland.net Hadeland НОРВЕГИЯ норвежский

Business Wire http://www.businesswire.com Business Wire США

Adelaide Now http://www.adelaidenow.com.au Adelaide Now АВСТРАЛИЯ English

MSNBC Local http://www.msnbc.msn.comMSNBC Местные США Английский

UDN.com http://forum.udn.com UDN.com ТАЙВАНЬ Китайский

CBS3 Филадельфия http://cbs3.com CBS3 Филадельфия США Английский

104,7 Edge Radio http://www.1047edgeradio.com 104,7 Edge Radio СОЕДИНЕННЫЕ ШТАТЫ

Таким образом, есть четыре от США, поэтому общий процент не должен быть 4/7 * 100

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Вы можете использовать предложение OVER, чтобы охватить весь набор данных с помощью COUNT, чтобы получить общее количество строк в одном запросе. Затем у вас есть оба значения (для каждой страны и всех строк) для генерации%

Должно быть что-то вроде:

SELECT  [Country]
    ,   [source_title_count] =  COUNT(*)
    ,   [source_total_count]  = COUNT(*) OVER ()
    ,   [source_percent]  = 100.0 * COUNT(*) / COUNT(*) OVER () 
FROM [dbo].[NewsSourcesMatch]
GROUP   BY [Country]

SELECT  [lang]
    ,   [source_title_count] =  COUNT(*)
    ,   [source_total_count]  = COUNT(*) OVER ()
    ,   [source_percent]  = 100.0 * COUNT(*) / COUNT(*) OVER () 
FROM [dbo].[NewsSourcesMatch]
GROUP   BY [lang]

Если нет, пожалуйста, добавьте пример данных и требуемый вывод.

Или это?

SELECT  [Country]
    ,   COUNT(DISTINCT [source_title)) AS source_title_count
    ,   COUNT(*) source_country_count
    ,   100.0 * COUNT(*) / COUNT(DISTINCT [source_title)) source_country_count
FROM [dbo].[NewsSourcesMatch]
GROUP  BY [Country]

Невозможно проверить это (без SQL на этом ПК), но на основе условия MSDN OVER

SELECT  [Country]
    ,   [source_title_count] =  COUNT(*)
     --attempt 1
    ,   [source_total_count]  = COUNT(*) OVER (Country)
    ,   [source_percent]  = 100.0 * COUNT(*) / COUNT(*) OVER (Country) 
     --attempt 2
    ,   [source_total_count]  = COUNT(*) OVER (PARTITION BY Country)
    ,   [source_percent]  = 100.0 * COUNT(*) / COUNT(*) OVER (PARTITION BY Country) 
FROM [dbo].[NewsSourcesMatch]
GROUP   BY [Country]
1 голос
/ 03 ноября 2010

Что-то вроде этого возможно:

;WITH T AS
(
SELECT  [Country]
    ,   Totals = COUNT(*)
FROM    [dbo].[NewsSourcesMatch]
GROUP BY [Country]
)
SELECT  [Country]
    ,   [source_title] 
    ,   [source_title_count] =  COUNT([source_title])
    ,   [source_title_pct]   =  COUNT([source_title])/t.Totals

FROM [dbo].[NewsSourcesMatch] A
    INNER JOIN
    T t
    ON A.country = t.Country

GROUP   BY A.[Country], [source_title]

И аналогично для lang

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