Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 sql server统计数据查询_Sql Server 2008_Aggregate - Fatal编程技术网

Sql server 2008 sql server统计数据查询

Sql server 2008 sql server统计数据查询,sql-server-2008,aggregate,Sql Server 2008,Aggregate,我有一个包含以下列的表 source_title, country, language, source_url 我需要生成一个查询,该查询将为我提供以下信息: country, source_title count, percentage of sources 及 基本上将国家映射到所有来源,并获得该映射的计数和百分比 不是像这样的行级数据 SELECT [source_id] ,[source_title] ,[source_url] ,[moreover] ,[count

我有一个包含以下列的表

source_title, country, language, source_url
我需要生成一个查询,该查询将为我提供以下信息:

country, 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\u title source\u url\u country lang

哈德兰挪威哈德兰挪威

美国商务英语

阿德莱德现在阿德莱德现在澳大利亚英语

MSNBC本地MSNBC本地美国英语

UDN.com UDN.com台湾华人

CBS3费城CBS3费城美国英语

104.7 Edge电台104.7 Edge电台美国英语


那么有四个来自美国,那么总的百分比不应该是4/7*100吗

;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

,您可以使用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),但基于


您所说的
来源和语言的百分比
来源的百分比
是什么意思?你能提供一些样本数据和期望的输出吗?在1000个条目中,与特定国家相匹配的源的百分比10与美国相匹配,以澄清:每个国家的源标题计数,以及该计数占所有行的百分比。语言也一样?哦,我很感谢你的回答,但不完全是这样…我想要以下内容:美国5/1000@vbNewbie,1000代表美国或世界的总计吗?国家/地区在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。我缺少GROUP BY。。。请立即尝试。不明确的列名“country”。Msg 209,16级,状态1,第9行感谢您的回复。一个问题是,源总计数不应该是表中的总记录,或者是如何计算的。其他一切都是正确的COUNT(*)over()只提供数据集中的行数,否?是的,但表中的总记录数为32000,每个国家的源总计数为204@vbNewbie:请参阅我的最后一行:使用示例数据更清楚地定义您想要的内容。表面上看,你要求的是一个相互矛盾的计数。谢谢你的耐心,终于用over子句找到了正确的组合。祝福你的帮助
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]
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]