【发布时间】:2020-12-08 14:59:12
【问题描述】:
利用 DATEDIFF 查找两个日期之间的天数差异很容易,我过去曾多次使用它。这次我似乎无法弄清楚我猜何时需要使用“外部”参考。我查询的目标是“回到过去”并查看我的 SQL Server 数据库中的票证。然后根据第一天计算他们在该月是否仍然营业的年龄,然后将计数放入“0 到 30 天”、“31 到 60 天”、“61 到 90 天”等桶中天”和“91 岁以上”。我这里有以下测试数据集:
USE [TestDB]
GO
/****** Object: Table [dbo].[taskDB] Script Date: 12/8/2020 9:49:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[taskDB](
[ticket] [varchar](50) NULL,
[created] [date] NULL,
[closed] [date] NULL,
[rating] [varchar](50) NULL,
[status] [varchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023345', CAST(N'2019-09-01' AS Date), CAST(N'2020-01-17' AS Date), N'Low', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023346', CAST(N'2019-08-01' AS Date), CAST(N'2019-08-03' AS Date), N'Critical', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023347', CAST(N'2019-09-01' AS Date), CAST(N'2019-09-20' AS Date), N'Critical', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023348', CAST(N'2019-08-01' AS Date), CAST(N'2020-08-06' AS Date), N'Critical', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023349', CAST(N'2020-08-01' AS Date), CAST(N'2020-08-05' AS Date), N'Medium', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023350', CAST(N'2019-08-01' AS Date), CAST(N'2019-08-05' AS Date), N'Medium', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023351', CAST(N'2019-12-22' AS Date), CAST(N'1900-01-01' AS Date), N'High', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023352', CAST(N'2019-11-07' AS Date), CAST(N'2020-08-05' AS Date), N'Medium', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023353', CAST(N'2020-08-02' AS Date), CAST(N'1900-01-01' AS Date), N'Low', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023354', CAST(N'2019-08-02' AS Date), CAST(N'2019-08-05' AS Date), N'Medium', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023356', CAST(N'2019-08-02' AS Date), CAST(N'2019-08-05' AS Date), N'Critical', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023357', CAST(N'2019-08-06' AS Date), CAST(N'2020-07-05' AS Date), N'Critical', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023358', CAST(N'2019-10-04' AS Date), CAST(N'1900-01-01' AS Date), N'Low', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023359', CAST(N'2019-12-02' AS Date), CAST(N'2020-02-25' AS Date), N'High', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023360', CAST(N'2019-08-05' AS Date), CAST(N'2019-08-05' AS Date), N'Medium', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023361', CAST(N'2020-08-02' AS Date), CAST(N'1900-01-01' AS Date), N'High', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023362', CAST(N'2019-09-02' AS Date), CAST(N'2019-10-06' AS Date), N'Critical', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023363', CAST(N'2019-10-03' AS Date), CAST(N'2019-11-08' AS Date), N'High', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023365', CAST(N'2019-10-03' AS Date), CAST(N'2019-12-08' AS Date), N'Low', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023364', CAST(N'2019-11-03' AS Date), CAST(N'2019-11-05' AS Date), N'High', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023366', CAST(N'2020-06-03' AS Date), CAST(N'1900-01-01' AS Date), N'High', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023368', CAST(N'2019-08-03' AS Date), CAST(N'2019-08-05' AS Date), N'High', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023367', CAST(N'2019-11-03' AS Date), CAST(N'1900-01-01' AS Date), N'Low', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023371', CAST(N'2019-08-03' AS Date), CAST(N'2019-08-05' AS Date), N'Low', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023370', CAST(N'2019-08-03' AS Date), CAST(N'2019-08-05' AS Date), N'Critical', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023434', CAST(N'2020-09-03' AS Date), NULL, N'Low', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'012312', CAST(N'2020-08-14' AS Date), NULL, N'High', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'054312', CAST(N'2020-10-16' AS Date), NULL, N'Medium', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'023423', CAST(N'2020-01-18' AS Date), NULL, N'High', N'Open')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'032444', CAST(N'2019-12-22' AS Date), CAST(N'2020-02-22' AS Date), N'High', N'Resolved')
INSERT [dbo].[taskDB] ([ticket], [created], [closed], [rating], [status]) VALUES (N'043234', CAST(N'2020-02-24' AS Date), CAST(N'2020-06-07' AS Date), N'Critical', N'Resolved')
GO
目前我构建的查询如下:
declare @FromDate datetime,
@ToDate datetime;
SET @FromDate = ('2020-08-01 00:00:00.000');
SET @ToDate = (Select max(created) From [TestDB].[dbo].[taskDB]);
declare @openTicketsBM table (firstDayOfMonth datetime, firstDayNextMonth datetime, year int, month int, Rating int, ZTT int, TTS int, STN int, ANN int)
Insert into @openTicketsBM(firstDayOfMonth, firstDayNextMonth, year, month)
Select top (datediff(month, @FromDate, @ToDate) + 1)
dateadd(month, number, @FromDate),
dateadd(month, number + 1, @FromDate),
year(dateadd(month, number, @FromDate)),
month(dateadd(month, number, @FromDate))
from [master].dbo.spt_values
where [type] = N'P' order by number;
update R
Set R.ZTT = (Select COUNT(CASE WHEN DATEDIFF(day, created, R.firstDayOfMonth) > 0 AND DATEDIFF(day, created, R.firstDayOfMonth) <= 30 THEN 1 ELSE NULL END) from [TestDB].[dbo].[taskDB] where created < R.firstDayNextMonth and NOT status like 'Risk Accepted' and (closed >= R.firstDayNextMonth or closed = '' or closed is null)),
R.TTS = (Select COUNT(CASE WHEN DATEDIFF(day, created, R.firstDayOfMonth) >= 31 AND DATEDIFF(day, created, R.firstDayOfMonth) <= 60 THEN 1 ELSE NULL END) from [TestDB].[dbo].[taskDB] where created < R.firstDayNextMonth and NOT status like 'Risk Accepted' and (closed >= R.firstDayNextMonth or closed = '' or closed is null)),
R.STN = (Select COUNT(CASE WHEN DATEDIFF(day, created, R.firstDayOfMonth) >= 61 AND DATEDIFF(day, created, R.firstDayOfMonth) <= 90 THEN 1 ELSE NULL END) from [TestDB].[dbo].[taskDB] where created < R.firstDayNextMonth and NOT status like 'Risk Accepted' and (closed >= R.firstDayNextMonth or closed = '' or closed is null)),
R.ANN = (Select COUNT(CASE WHEN DATEDIFF(day, created, R.firstDayOfMonth) > 90 THEN 1 ELSE NULL END) from [TestDB].[dbo].[taskDB] where created < R.firstDayNextMonth and NOT status like 'Risk Accepted' and (closed >= R.firstDayOfMonth or closed = '' or closed is null))
From @openTicketsBM R
select CAST(year AS VARCHAR(50)) + '/' + CAST(month AS VARCHAR(50)) AS date,
ZTT,
TTS,
STN,
ANN
from @openTicketsBM
运行此查询时会生成以下错误:
Msg 8124, Level 16, State 1, Line 20
Multiple columns are specified in an aggregated expression containing an outer reference. If an expression being aggregated contains an outer reference, then that outer reference must be the only column referenced in the expression.
这看起来很简单,但我显然遗漏了一些东西。
EDITT 2020 年 12 月 18 日上午 10:18 东部时间
为了澄清我的逻辑,让我们回到 2020 年 2 月。2 月 1 日开放了多少张门票,它们的年龄是多少?结果应该是这样的
date ZTT(0-30) TTS(31-60) STN(61-90) ANN(91+)
2020/2 5 3 3 1
【问题讨论】:
-
对您想要做什么的简单解释会有所帮助。我想你可以用一个更简单的例子重现这个问题。
-
嗯,我们肯定有样本数据,@GordonLinoff,并且是迄今为止最好的形式; DDL 和 DML 语句。
-
根据我目前的问题,这很简单。
-
是的,但我们不知道您在这里尝试执行的逻辑 @mister.cake ,也不知道预期的结果。这也是我们需要的。
-
好的,我添加了一个编辑。
标签: sql sql-server