使用SSMS(SQL Server Management Studio)-2012请帮助我完成此SQL查询的构建。第一表Sites Client,Market,Project,SiteNumber grum , lad , aaa , 12345 gla , daa , h11 , 56789第二表SitesStatusSiteNumber,StatusName,Date(DateTime),ByUser12345 , sta1 , 8/7/13 15:33:22, hec12345 , sta1 , 8/7/13 15:43:22, hec12345 , sta2 , 8/7/13 15:53:22, hec12345 , sta2 , 8/7/13 16:03:22, hec12345 , sta2 , 8/7/13 16:13:22, hec56789 , sta1 , 8/7/13 15:22:22, hec56789 , sta2 , 8/7/13 15:32:22, hec所需结果Client,Market,Project,TotalSites, sta1 ,TotStatTime, sta2 ,TotStat2Time,ByUser Grum , lad , aaa , 5 , 2 , 10 , 3 , 20 , hec gla , daa , h11 , 2 , 1 , inprogress, 1 , inprogress , hec它必须显示表2中“日期”列中与表1中的sitenumber相对应的所有行的小时数,而且还必须在找不到结果的列/行中放置一个inprogress。要计算的数字。 (如果不可能的话,我也可以在我的代码中执行此操作。)此外,它可能还具有值,但还没有“最后一个值”,例如在计时但没有计时的时间内。请记住,所有状态都是已知的,不会改变。 (所以我知道我将只有X个状态,在此示例中X为2。)到目前为止我尝试过的是:select Client, Market, ProjectType, count(*) as Total, sum(case when StatusName = 'sta1' then 1 else 0 end) as 'sta1', sum(case when StatusName = 'sta2' then 1 else 0 end) as 'sta2'--Here is where I'd like to add the Time adding for the joined table2from Sites sINNER JOIN SitesStatus sson s.sitenumber = ss.SiteNumberwhere (StatusName in ( 'sta1', 'sta2', ) )group by Client, Market, ProjectType@Andi M编辑:我在这里说-这里是我要为上面的联接表2添加时间的地方,我想知道为Site Dates和状态匹配的列Date(DateTime)添加所有行的逻辑所以12345有2个sta1条目1起始条目2我想加/减的条目从第一个条目获取时间12345也有3个sta2条目,我们将在第一个条目中添加/减去最后一个条目以获取时间。56789有1个sta1和1个sta2,因为代码没有结束值,所以我想让代码显示的时间是(-)或(inProgress)。更清楚了吗? 最佳答案 以其最基本的形式,一种修改查询以返回所需的附加数据位的方法是:select s.Client, s.Market, s.ProjectType, count(*) as Total, sum(case when ss.StatusName = 'sta1' then 1 else 0 end) as sta1, sum(case when ss.StatusName = 'sta2' then 1 else 0 end) as sta2, datediff( minute, min(case ss.StatusName when 'sta1' then ss.Date end), max(case ss.StatusName when 'sta1' then ss.Date end) ) as TotSta1Time, datediff( minute, min(case ss.StatusName when 'sta2' then ss.Date end), max(case ss.StatusName when 'sta2' then ss.Date end) ) as TotSta2Timefrom Sites sINNER JOIN SitesStatus sson s.sitenumber = ss.SiteNumberwhere ( StatusName in ( 'sta1', 'sta2', ))group by Client, Market, ProjectType;对于仅包含一行的组,min()和max()都将返回相同的值,因此datediff()的值将为0。可以将0转换为'inprogress',但是请注意,这将在同一列中混合使用不同类型。您可能要考虑只返回NULL,然后在应用程序中将它们解释为inprogress。为此,您只需要将datediff调用放在nullif()内:... nullif( datediff( minute, min(case ss.StatusName when 'sta1' then ss.Date end), max(case ss.StatusName when 'sta1' then ss.Date end) ), 0 ) as TotSta1Time, nullif( datediff( minute, min(case ss.StatusName when 'sta2' then ss.Date end), max(case ss.StatusName when 'sta2' then ss.Date end) ), 0 ) as TotSta2Time...但是,如果您完全确定需要查询来返回准备显示的结果(如在所需结果中一样),则只需要向两个新表达式中的每一个添加另外两个函数调用,一个CAST / 设置为CONVERT,一个varchar / ISNULL默认将NULL设置为COALESCE:... coalesce( convert( varchar(10), nullif( datediff( minute, min(case ss.StatusName when 'sta1' then ss.Date end), max(case ss.StatusName when 'sta1' then ss.Date end) ), 0 ) ), 'inprogress' ) as TotSta1Time, coalesce( convert( varchar(10), nullif( datediff( minute, min(case ss.StatusName when 'sta2' then ss.Date end), max(case ss.StatusName when 'sta2' then ss.Date end) ), 0 ) ), 'inprogress' ) as TotSta2Time...关于sql-server - 如何在SQL的DateTime字段上运行求和,并在单列上加入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18110465/
10-11 07:59