1

是否可以使用 Lag 从另一个表中选择和汇总项目并从另一个表中领先,范围如下。

SELECT @Last  = MAX(ID) from [dbo].[#Temp] 
     select  opl.Name  as [Age Categories] ,  
     ( SELECT count([dbo].udfCalculateAge([BirthDate],GETDATE())) 
       FROM    [dbo].[tblEmployeeDetail] ed  
       inner join  [dbo].[tblEmployee] e 
       on   ed.EmployeeID = e.ID 
      where    convert(int,[dbo].udfCalculateAge(e.[BirthDate],GETDATE()))
             between LAG(opl.Name) OVER (ORDER BY opl.id)   
                 and (CASE opl.ID WHEN   @Last  THEN '100'  ELSE  opl.Name End ) 
     )  as Total
FROM [dbo].[#Temp] opl 

tblEmployee 包含员工及其出生日期

  INSERT INTO @tblEmployees VALUES
(1, 'A', 'A1', 'A', '1983/01/02'),
(2, 'B', 'B1', 'BC', '1982/01/02'),
(3, 'C', 'C1', 'JR2', '1982/10/11'),
(4, 'V', 'V1', 'G', '1990/07/12'),
(5, 'VV', 'VV1', 'J', '1992/06/02'),
(6, 'R', 'A', 'D', '1982/05/15'),
(7, 'C', 'Ma', 'C', '1984/09/29')

下一个表是根据用户输入的年龄创建的临时表,例如“20;30;50;60”在下面生成一个临时表,使用函数拆分

 select * FROM  [dbo].[Split](';','20;30;50;60') 

温度表

pn  s
1   20
2   30
3   50
4   60

所需的输出如下,尽管列 Age Categories 可以在 C# 的数据表中重命名。l 需要总列在范围上是准确的。

Age Categories      Total
up to 20            0
21 - 30             2
31 - 50             5
51 - 60             0
4

1 回答 1

2

这些方面的东西应该适合你:

declare @tblEmployees table(
ID int,    
FirstNames varchar(20),       
Surname varchar(20),     
Initial varchar(3),    
BirthDate date)

INSERT INTO @tblEmployees VALUES
(1, 'A', 'A1', 'A', '1983/01/02'),
(2, 'B', 'B1', 'BC', '1982/01/02'),
(3, 'C', 'C1', 'JR2', '1982/10/11'),
(4, 'V', 'V1', 'G', '1990/07/12'),
(5, 'VV', 'VV1', 'J', '1992/06/02'),
(6, 'R', 'A', 'D', '1982/05/15'),
(7, 'C', 'Ma', 'C', '1984/09/29')

declare @temp table
(id int identity,
age int)

INSERT INTO @temp 
SELECT cast(item as int) FROM dbo.fnSplit(';','20;30;50;60')

declare @today date = GetDate()
declare @minBirthCutOff date = (SELECT DATEADD(yy, -MAX(age), @today) FROM @temp)
declare @minBirth date = (SELECT Min(birthdate) from @tblEmployees)
IF @minBirth < @minBirthCutOff
    BEGIN
        INSERT INTO @temp VALUES (100)
    end
SELECT COALESCE(CAST((LAG(t.age) OVER(ORDER BY t.age) + 1) as varchar(3)) 
+ ' - ','Up to ') 
       + CAST(t.age AS varchar(3)) AS [Age Categories], 
       COUNT(e.id) AS [Total] FROM @temp t
LEFT JOIN
(SELECT te.id, 
       te.age, 
       (SELECT MIN(age) FROM @temp t WHERE t.age > te.age) AS agebucket
FROM (select id, 
      dbo.udfCalculateAge(birthdate,@today) age from @tblEmployees) te) e
ON e.agebucket = t.age
GROUP BY t.age ORDER BY t.age

结果集如下所示:

Age Categories  Total
Up to 20    0
21 - 30 2
31 - 50 5
51 - 60 0

以供将来参考,特别是在询问 SQL 问题时,如果您提供我所做的大部分工作,您将获得更快更好的响应。即为相关表创建语句并插入语句以提供示例数据。你这样做比我们容易得多(我们必须复制和粘贴,然后重新格式化等),而你应该能够通过一些选择 SELECT 语句来做同样的事情!

另请注意,当生日超出给定范围时,我处理的情况完全不同。通过 MAX 进行一次检查比使 SELECT 语句复杂化更有效。它也使它更具可读性。

感谢 HABO 对 GetDate() 的建议

于 2017-09-03T08:14:24.330 回答