Sql 如何汇总计数组数

Sql 如何汇总计数组数,sql,sql-server,group-by,sql-server-2008-r2,rollup,Sql,Sql Server,Group By,Sql Server 2008 R2,Rollup,ROLLUP允许跨多个分组级别进行聚合,就像我联合了多个简单的SELECT语句一样 但我希望能够聚合较低级别分组的结果,就像使用嵌套的SELECT语句或相互依赖的CTE链一样 例如,我希望能够从分组的较低级别计算组数,或计算较低级别和的平均值或较低级别最大值的最小值,e.t.c 更具体的例子:如果我有在美国发生的每起车祸的记录,我不仅想得到汇总中每个级别(州、县、市、邮编)的事故数,还想得到人数(显然每个人可能涉及多起事故,因此也有多起记录) 是否可以通过汇总实现这一点? 如果可能的话,怎么做

ROLLUP允许跨多个分组级别进行聚合,就像我联合了多个简单的SELECT语句一样

但我希望能够聚合较低级别分组的结果,就像使用嵌套的SELECT语句或相互依赖的CTE链一样

例如,我希望能够从分组的较低级别计算组数,或计算较低级别和的平均值或较低级别最大值的最小值,e.t.c

更具体的例子:如果我有在美国发生的每起车祸的记录,我不仅想得到汇总中每个级别(州、县、市、邮编)的事故数,还想得到人数(显然每个人可能涉及多起事故,因此也有多起记录)

是否可以通过汇总实现这一点? 如果可能的话,怎么做

SQL示例及其结果:

if object_id('accident') is not null drop table accident
create table accident(
     id int identity(1,1)
    ,state varchar(50)
    ,city varchar(50)
    ,zip varchar(50)
    ,person varchar(50)
)

insert accident(state,city,zip,person)values
 ('NY','Manhattan',10001,'John')
,('NY','Manhattan',10001,'John')
,('NY','Manhattan',10001,'Barbara')

select
    state,city,zip,person
    ,accidents=count(1)
    -- the following line causes error: Windowed functions cannot be used in the context of another windowed function or aggregate.
    --,people=sum(case when row_number()over(partition by person order by (select 0))=1 then 1 else 0 end)
from accident
group by rollup(state,city,zip,person)

;with person as (select state,city,zip,person from accident group by state,city,zip,person)
    select
        state,city,zip
        ,people=count(1)
    from person
    group by rollup(state,city,zip)
结果:

state   city    zip person  accidents
NY  Manhattan   10001   Barbara 1
NY  Manhattan   10001   John    2
NY  Manhattan   10001   NULL    3
NY  Manhattan   NULL    NULL    3
NY  NULL    NULL    NULL    3
NULL    NULL    NULL    NULL    3


state   city    zip people
NY  Manhattan   10001   2
NY  Manhattan   NULL    2
NY  NULL    NULL    2
NULL    NULL    NULL    2
参见第一个结果返回,每级3次事故,第二个结果返回2次事故。 如果希望在一个汇总查询中同时获得3和2。 我的问题是窗口函数不能嵌套

我刚才问的问题可以通过以下查询实现:

;with person as (select state,city,zip,person,accidents=count(1) from accident group by state,city,zip,person)
        select
            state,city,zip
            ,accidents=sum(accidents)
            ,people=count(1)
        from person
        group by rollup(state,city,zip)

state   city    zip accidents   people
NY  Manhattan   10001   3   2
NY  Manhattan   NULL    3   2
NY  NULL    NULL    3   2
NULL    NULL    NULL    3   2
但这样做需要明确地为每个级别编写CTE

我希望能够编写一个查询,该查询可以访问分组级别较低的结果,而不考虑分组级别的数量

我试过这个:

;with
    lvl as (
            select *
                    ,lvl = -1
                    ,accidents=1
                    ,people=1
                from accident
            union all
            select accident.*
                    ,lvl = grouping_id(accident.state,accident.city,accident.zip,accident.person)
                    ,accidents=sum(accidents)
                    ,people=count(1)
                from accident
                join lvl prev on prev.lvl = (grouping_id(accident.state,accident.city,accident.zip,accident.person)+1)/2-1
                group by rollup(accident.state,accident.city,accident.zip,accident.person)
        )
        select * from lvl
但是有错误:

Msg 1015, Level 15, State 1, ...
An aggregate cannot appear in an ON clause unless it is in a subquery contained in a HAVING clause or select list, and the column being aggregated is an outer reference.
Msg 467, Level 16, State 1, ...
GROUP BY, HAVING, or aggregate functions are not allowed in the recursive part of a recursive common table expression 'lvl'.

相关问题:

请提供一个包含数据和所需结果的示例。请在此处阅读这些分组集:分组集文档如何回答我的问题?你能指出或引用具体的地点吗?如果有人想看到与DLINQ相关的问题,请看这里: