Sql 子查询中的多个“分组依据”
下面的查询来自一个视图。之所以使用Case,是因为巡更号来自基于名称值的不同字段 子查询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
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;