Sql server 循环查询并查看以前的记录-SQL Server
我有一个SQL:Sql server 循环查询并查看以前的记录-SQL Server,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个SQL: ;WITH cte AS ( SELECT lngTIMEID as Id, lngEMPID as EmployeeId, dtmdateapp AS [Date], stroccur AS [Value], (SELECT SUM(stroccur) FROM [Attendance].[dbo].[timeuse] WHERE dtmdat
;WITH cte AS
(
SELECT
lngTIMEID as Id,
lngEMPID as EmployeeId,
dtmdateapp AS [Date],
stroccur AS [Value],
(SELECT SUM(stroccur)
FROM [Attendance].[dbo].[timeuse]
WHERE dtmdateapp <= d.dtmdateapp
AND dtmdateapp >= Dateadd(yy, -1, d.dtmdateapp)
AND lngempid = d.lngempid
AND absence <> 'Scheduled') AS Total
FROM
[Attendance].[dbo].[timeuse] d
WHERE
lngEMPID = 1162002 AND Absence <> 'Scheduled'
)
SELECT
cte.*,
CASE
WHEN Total >= 1 AND Total < 2 AND cte.[Date] <= DATEADD(DD, 90, h.HireDate) THEN 'Written'
WHEN Total > 2 AND cte.[Date] <= DATEADD(DD, 90, h.HireDate) THEN 'Final'
WHEN Total >= 3 AND Total < 4 THEN 'Verbal'
WHEN Total >= 4 AND Total < 5 THEN 'Written'
WHEN Total >= 5 AND Total < 6 THEN 'Final'
WHEN Total >= 6 THEN 'Termination'
END AS [Status]
FROM
cte
JOIN
[CSAR].[dbo].[rpt_tblAssociate] c ON c.EmployeeID = cte.EmployeeId
JOIN
[CSAR].[dbo].[rpt_tblEmployHx] h ON h.ReportingId = c.ReportingId
WHERE
Date > DATEADD(yy, -1, GETDATE())
我想确定在此数据集中发布最终状态的次数。在我展示的这个数据中,我想将其转换为结果2
如果数据集显示连续的最终结果,则它们应仅计为1。例如,296746、298464有两个连续的最终状态…这只会在最终状态计数中增加1
以下是我试图实现的目标:
var finalcount = 0;
var previous = "";
foreach ( var record in recordset)
{
if(record.Status == "Final" && prevous.Status != "Final")
{
finalcount++;
}
previous = record;
}
无需重新编码现有代码,您可以将其包装在另一个通用表表达式中,并使用lag: rextester演示: 包装在另一个cte现有代码中以添加上述内容的示例:
;WITH cte
AS (SELECT lngTIMEID as Id,
lngEMPID as EmployeeId,
dtmdateapp AS [Date],
stroccur AS [Value],
(SELECT Sum(stroccur)
FROM [Attendance].[dbo].[timeuse]
WHERE dtmdateapp <= d.dtmdateapp
AND dtmdateapp >= Dateadd(yy, -1, d.dtmdateapp)
AND lngempid = d.lngempid
AND absence <> 'Scheduled') AS Total
FROM [Attendance].[dbo].[timeuse] d
WHERE lngEMPID = 1162002 AND Absence <> 'Scheduled' )
, t as (
SELECT cte.*, CASE
WHEN Total >= 1 AND Total < 2 AND cte.[Date] <= DATEADD(DD, 90, h.HireDate) THEN 'Written'
WHEN Total > 2 AND cte.[Date] <= DATEADD(DD, 90, h.HireDate) THEN 'Final'
WHEN Total >= 3 AND Total < 4 THEN 'Verbal'
WHEN Total >= 4 AND Total < 5 THEN 'Written'
WHEN Total >= 5 AND Total < 6 THEN 'Final'
WHEN Total >= 6 THEN 'Termination'
END AS [Status]
FROM cte
JOIN [CSAR].[dbo].[rpt_tblAssociate] c ON c.EmployeeID = cte.EmployeeId
JOIN [CSAR].[dbo].[rpt_tblEmployHx] h ON h.ReportingId = c.ReportingId
WHERE Date > DATEADD(yy, -1, GETDATE())
)
select CountFinal = count(*)
from (
select *, prev_status = lag(status) over (order by id)
from t
) sub
where sub.Status = 'Final'
and isnull(sub.prev_status,'') <> 'Final'
通过重新编码,我相信您可以将其简化为以下内容:
+--------+------------+------------+-------+-------+-------------+
| Id | EmployeeId | Date | Value | Total | Status |
+--------+------------+------------+-------+-------+-------------+
| 286320 | 1162002 | 9/13/2016 | 0.00 | 1.75 | NULL |
| 288479 | 1162002 | 9/29/2016 | 0.25 | 2.25 | NULL |
| 288523 | 1162002 | 9/28/2016 | 0.25 | 2.00 | NULL |
| 290832 | 1162002 | 10/17/2016 | 1.00 | 3.25 | Verbal |
| 290833 | 1162002 | 10/17/2016 | 0.00 | 3.25 | Verbal |
| 295309 | 1162002 | 11/17/2016 | 0.25 | 3.50 | Verbal |
| 296655 | 1162002 | 12/1/2016 | 1.00 | 4.50 | Written |
| 296746 | 1162002 | 12/2/2016 | 1.00 | 5.50 | Final |
| 298464 | 1162002 | 12/6/2016 | 0.25 | 5.75 | Final |
| 299658 | 1162002 | 12/14/2016 | 0.25 | 6.00 | Termination |
| 300320 | 1162002 | 12/19/2016 | 0.25 | 6.25 | Termination |
| 302682 | 1162002 | 1/6/2017 | 0.25 | 6.50 | Termination |
| 317070 | 1162002 | 2/15/2017 | 0.25 | 5.75 | Final |
| 324818 | 1162002 | 3/15/2017 | 0.25 | 6.00 | Termination |
| 330543 | 1162002 | 4/17/2017 | 0.25 | 6.25 | Termination |
| 333859 | 1162002 | 5/8/2017 | 0.00 | 6.25 | Termination |
| 334141 | 1162002 | 5/9/2017 | 1.00 | 7.25 | Termination |
| 336519 | 1162002 | 5/21/2017 | 0.25 | 7.50 | Termination |
+--------+------------+------------+-------+-------+-------------+
;with cte as (
select
lngtimeid as Id
, lngempid as EmployeeId
, dtmdateapp as [Date]
, stroccur as [Value]
, x.Total
, prev_total = lag(x.Total) over (order by lngtimeid)
from [Attendance].[dbo].[timeuse] d
cross apply (
select total = sum(stroccur)
from [Attendance].[dbo].[timeuse] i
where i.dtmdateapp <= d.dtmdateapp
and i.dtmdateapp >= Dateadd(year,-1, d.dtmdateapp)
and i.lngempid = d.lngempid
and i.absence <> 'Scheduled'
) x
where d.lngempid = 1162002
and d.Absence <> 'Scheduled'
)
select CountFinal = count(*)
from cte
where date > dateadd(year,-1, getdate())
and (Total >= 5 and Total < 6)
and not (isnull(prev_total,0) >= 5 and isnull(prev_total,0) < 6)
sql server的哪个版本?@SqlZim我有2012这似乎是我要找的,而且你的测试仪看起来不错。如何在我的查询中使用您的解决方案?我没有存储所有这些数据的数据库表。我只是有这个sql查询。谢谢你,非常感谢你的帮助。@Aaron很乐意帮忙!
;with cte as (
select
lngtimeid as Id
, lngempid as EmployeeId
, dtmdateapp as [Date]
, stroccur as [Value]
, x.Total
, prev_total = lag(x.Total) over (order by lngtimeid)
from [Attendance].[dbo].[timeuse] d
cross apply (
select total = sum(stroccur)
from [Attendance].[dbo].[timeuse] i
where i.dtmdateapp <= d.dtmdateapp
and i.dtmdateapp >= Dateadd(year,-1, d.dtmdateapp)
and i.lngempid = d.lngempid
and i.absence <> 'Scheduled'
) x
where d.lngempid = 1162002
and d.Absence <> 'Scheduled'
)
select CountFinal = count(*)
from cte
where date > dateadd(year,-1, getdate())
and (Total >= 5 and Total < 6)
and not (isnull(prev_total,0) >= 5 and isnull(prev_total,0) < 6)