Sql 子查询中的多个“分组依据”

Sql 子查询中的多个“分组依据”,sql,sql-server,tsql,Sql,Sql Server,Tsql,下面的查询来自一个视图。之所以使用Case,是因为巡更号来自基于名称值的不同字段 子查询 select timetag1, name, case when name = 'Location1' then afield17 when name = 'Location2' then afield16 when name = 'Location3' then afield22 end as PatrolNo FROM someView where timet

下面的查询来自一个视图。之所以使用Case,是因为巡更号来自基于名称值的不同字段

子查询

select timetag1, name,   
case when name = 'Location1' then afield17
     when name = 'Location2' then afield16 
     when name = 'Location3' then afield22 end as PatrolNo
FROM         someView
where timetag1 > (getdate-2) and timetag1 < GETDATE()
group by PatrolNo, Name
现在我想使用上面的查询作为子查询,因为它已经来自视图,我不想使用嵌套视图 所以我可以在给定的日期得到给定地点的巡逻人数

它类似于按日期分组,然后根据巡逻次数按位置分组

例如,如果您在第19个位置的当天从下面的第一行开始,1有一个值为A的巡逻编号

期望

name        timetag1        PatrolNo     Count

Location1   2014-07-19          A            1

Location1   2014-07-19          B            1

Location1   2014-07-19          C            1

Location2   2014-07-19          A            1

Location2   2014-07-19          B            2

Location3   2014-07-19          C            1

Location1   2014-07-18          A            1

Location1   2014-07-18          B            2

Location2   2014-07-18          C            1

Location2   2014-07-18          B            1

Location3   2014-07-18          A            1

Location3   2014-07-18          C            1
不成功的尝试:

select temp.timetag1, temp.PatrolNo, COUNT(*) from

(select timetag1, name,   
case when name = 'Location1' then afield17
     when name = 'Location2' then afield16 
     when name = 'Location3' then afield22 end as PatrolNo
FROM         someView
where timetag1 > (getdate-2) and timetag1 < GETDATE()) as temp

group by timetag1, name, PatrolNo
你非常接近:

select cast(temp.timetag1 as date), temp.PatrolNo, COUNT(*)
from (select timetag1, name,   
             (case when name = 'Location1' then afield17
                   when name = 'Location2' then afield16 
                   when name = 'Location3' then afield22
              end) as PatrolNo
      FROM  someView
      where timetag1 > (getdate() - 2) and timetag1 < GETDATE()
    ) temp
group by cast(temp.timetag1 as date), PatrolNo;

主要更改是从GROUPBY子句中删除名称。另外,我假设第一次提到getdate是一个函数调用,因此,我添加了parens。

Gordon还有一件事我没有考虑到,那就是timetag1是日期时间字段,但我只想排除时间和按日期分组,否则每个条目都将是唯一的,因为时间的原因。我认为可能还需要修复PatrolNo和PetrolNo的不一致使用。更改为PatrolNo,这是应该的be@HakanZim . . . 只需将值转换为日期。
select cast(temp.timetag1 as date), temp.PatrolNo, COUNT(*)
from (select timetag1, name,   
             (case when name = 'Location1' then afield17
                   when name = 'Location2' then afield16 
                   when name = 'Location3' then afield22
              end) as PatrolNo
      FROM  someView
      where timetag1 > (getdate() - 2) and timetag1 < GETDATE()
    ) temp
group by cast(temp.timetag1 as date), PatrolNo;