2015-02-11 102 views
0

我有数据,人们在月中更改了角色,并且想要在新的开始日期之后对活动进行计数。我可以用一个表的结果作为动态查询,我有一个查询返回以下结果集: -T-SQL动态查询和关键点

Firstname Surname StartDate 
---------------------------------- 
Jon   Smith  2015-01-01 
Paul   Jones  2014-07-23 
... 

所以查询看起来是这样的:

SELECT Firstname +' '+ surname, month, count(1) FROM dataTable 
WHERE (Firstname='John' AND Surname='Smith' AND date >=2015-01-01) 
OR (Firstname='Paul' AND Surname='Jones' AND date >=2014-07-23) 
OR ... 

但数量“手术室”将取决于行数在第一个表

Name  Month Count 
---------------------------------- 
Jon Smith 1  15 
Paul Jones 1  16 
Jon Smith 2  30 
Paul Jones 2  25 
Charlie Gu 1  52 

,我可以再转动得到

Name   1  2 
-------------------------- 
Jon Smith  15  30 
Paul Jones 16  25 
Charlie Gu 52  NULL 

在此先感谢

+0

我想你可以通过为你的查询声明一个varchar变量来实现创建一个动态查询,并在你的“或者子句”中迭代你想要的数据。之后执行内置的存储过程“exec sp_executesql @yourquery” – Shiffty 2015-02-11 11:01:51

+1

也许我错过了什么,为什么要创建一个动态查询而不是加入包含start-enddate和employee角色的表的原因是什么? – Ako 2015-02-11 15:25:02

回答

1

在我看来,这Ako是正确的,一个简单的加入应该做的伎俩,而不是动态查询。

declare @NewStartDates table 
    (
    Firstname nvarchar(100), 
    Surname nvarchar(100), 
    StartDate date 
    ); 

insert into @NewStartDates 
     (Firstname, Surname, StartDate) 
values (N'Jon', N'Smith', '20150101'), 
     (N'Paul', N'Jones', '20140723'); 

select d.Firstname, 
     d.Surname, 
     year(d.Date) * 100 + month(d.Date) as Period, 
     count(*) as ActivityCount 
from dataTable as d 
inner join @NewStartDates as n 
     on d.Firstname = n.Firstname 
      and d.Surname = n.Surname 
      and d.Date >= n.StartDate 
group by d.Firstname, 
     d.Surname, 
     year(d.Date) * 100 + month(d.Date);