2010-11-03 77 views
1

我有以下的列的表SQL Server的统计查询

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哈德兰挪威挪威

美国商业资讯http://www.businesswire.com美国商业资讯美国英语

阿德莱德现在http://www.adelaidenow.com.au阿德莱德现在澳大利亚英语

MSNBC本地http://www.msnbc.msn.com MSNBC当地美国英语

UDN.com http://forum.udn.com UDN.com台湾中文

CBS3 Philadelphia http://cbs3.com CB S3费城美国英语

104.7 Edge无线http://www.1047edgeradio.com 104.7边缘无线电美国英语

因此有四位来自美国那么不应该总比例是4/7 * 100

+0

你所说的'来源和language'率和sources'的'百分比是什么意思?你能提供一些样本数据和期望的输出吗? – 2010-11-03 18:01:34

+0

与特定国家/地区匹配的来源百分比 - 与1000个条目中的数量相匹配10个匹配美国 – vbNewbie 2010-11-03 18:05:06

+0

以阐明:每个国家/地区的source_title数量,以及此计数所有行的百分比。同上语言? – gbn 2010-11-03 18:20:52

回答

1

可以使用OVER圣诞老人e使用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 clause

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] 
+0

感谢您的回复。有一个问题,来源总数应该不是表中的全部记录,或者是如何计算的。一切正常 – vbNewbie 2010-11-03 18:23:54

+0

COUNT(*)over()只是给你数据集中的行数,不是? – 2010-11-03 18:25:32

+0

是的,但表中的总记录是32000,每个国家的source_total_count是204 – vbNewbie 2010-11-03 18:27:15

1

像这样的东西可能:

;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

+0

哦,我感谢您的回复,但并不是那里......我想要以下内容:USA 5 5/1000 – vbNewbie 2010-11-03 18:10:05

+0

@vbNewbie,千位代表总数是否为美国或世界? – 2010-11-03 18:15:05

+0

country在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 – vbNewbie 2010-11-03 18:17:34