MS SQL、子查询和 EXISTS 错误
MS SQL, Subqueries and EXISTS ERROR
我有一个 MS SQL 2012 数据库 table 有 6 列
ID
JobDate DATETIME
DriverID INT
JobNUmber NVARCHAR(20)
JobStart TIME
JobEnd TIME
我正在尝试生成一个查询,该查询将为每个 driver 的每一天提供一行,其中包括日期、JobNumbers 的计数、最早的 JobStart 和最新的 JobEnd(这部分很简单)然后是总小时数和总分钟数以及总分钟数。第二部分我只有在每个特定的日子和 driver 分开工作时才能开始工作。 (哎呀!)
我收到错误消息“当子查询未使用 EXISTS 引入时,只能在 select 列表中指定一个表达式。
这就是我正在努力完成的工作。
DECLARE @mnth NVARCHAR(20) = 'Jan-16'
DECLARE @FROM NVARCHAR(20) = '2015-12-28'
DECLARE @TO NVARCHAR(20) = '2016-01-31'
SELECT @mnth AS 'Month',
x.DriverID As 'Driver',
DAY(x.JobDate) AS 'Day' ,
COUNT(x.JobNumber) AS 'Stops',
MIN(x.JobStart) AS 'Start',
MAX(x.JobEnd) AS 'End',
(SELECT
SUM(hrs) AS 'Hours', SUM(mins) AS 'Minutes', SUM(ABS(hrs * 60) + (ABS(mins))) AS 'Total Minutes'
FROM
( SELECT
ABS(SUM(E_hrs - S_hrs)) AS hrs,
ABS(SUM(E_mins - S_mins)) AS mins
FROM
(SELECT
DATEPART(HOUR,MIN(j.JobEnd)) AS E_hrs,
DATEPART(HOUR,MAX(j.JobStart)) AS S_hrs,
DATEPART(MINUTE,MAX(j.JobEnd)) AS E_mins,
DATEPART(MINUTE,MIN(j.JobStart)) AS S_mins
FROM Xora_Job_Time j
WHERE j.JobDate = x.JobDate
AND j.DriverID = x.DriverID
) a
) b
) c
FROM Xora_Job_Time x
WHERE x.JobDate >= @FROM
AND x.JobDate <= @TO
GROUP BY DriverID, DAY(JobDate), JobDate
ORDER BY DriverID, DAY(JobDate)
这部分效果很好!
DECLARE @mnth NVARCHAR(20) = 'Jan-16'
DECLARE @FROM NVARCHAR(20) = '2015-12-28'
DECLARE @TO NVARCHAR(20) = '2016-01-31'
SELECT @mnth AS 'Month',
x.DriverID As 'Driver',
DAY(x.JobDate) AS 'Day' ,
COUNT(x.JobNumber) AS 'Stops',
MIN(x.JobStart) AS 'Start',
MAX(x.JobEnd) AS 'End'
FROM Xora_Job_Time x
WHERE x.JobDate >= @FROM
AND x.JobDate <= @TO
GROUP BY DriverID, DAY(JobDate)
ORDER BY DriverID, DAY(JobDate)
并为我提供了我正在寻找的信息,但尝试添加时间计数导致此操作失败并出现 EXISTS 错误。
这行得通,但我每天都需要自己做 driver....
SELECT SUM(hrs)AS 'Hours', SUM(mins) AS 'Minutes', SUM(ABS(hrs * 60) + (ABS(mins))) AS 'Total Minutes'
FROM
( SELECT
ABS(SUM(E_hrs - S_hrs)) AS hrs,
ABS(SUM(E_mins - S_mins)) AS mins
FROM
(SELECT
DATEPART(HOUR,MIN(JobEnd)) AS E_hrs,
DATEPART(HOUR,MAX(JobStart)) AS S_hrs,
DATEPART(MINUTE,MAX(JobEnd)) AS E_mins,
DATEPART(MINUTE,MIN(JobStart)) AS S_mins
FROM Xora_Job_Time
WHERE JobDate = '2016-01-06'
AND DriverID = '3') a
) b
我得到的错误是带有 EXIST 的子查询,我看不到我需要 EXIST 子句的地方,更不用说它有帮助的地方了。
尽管如此,在此先感谢!
您不能在 SELECT
列表的子 select 中有多个记录。我想你要找的是 CROSS APPLY
:
Declare @Mnth NVarchar(20) = 'Jan-16';
Declare @From NVarchar(20) = '2015-12-28';
Declare @To NVarchar(20) = '2016-01-31';
Select @Mnth As 'Month'
, x.DriverID As 'Driver'
, Day(x.JobDate) As 'Day'
, Count(x.JobNumber) As 'Stops'
, Min(x.JobStart) As 'Start'
, Max(x.JobEnd) As 'End'
, c.Hours
, c.Minutes
, c.[Total Minutes]
From Xora_Job_Time x
Cross Apply (Select Sum(b.hrs) As 'Hours'
, Sum(b.mins) As 'Minutes'
, Sum(Abs(b.hrs * 60) + (Abs(b.mins))) As 'Total Minutes'
From (Select Abs(Sum(a.E_hrs - a.S_hrs)) As hrs
, Abs(Sum(a.E_mins - a.S_mins)) As mins
From (Select DatePart(Hour, Min(j.JobEnd)) As E_hrs
, DatePart(Hour, Max(j.JobStart)) As S_hrs
, DatePart(Minute, Max(j.JobEnd)) As E_mins
, DatePart(Minute, Min(j.JobStart)) As S_mins
From Xora_Job_Time j
Where j.JobDate = x.JobDate
And j.DriverID = x.DriverID
) a
) b
) c
Where x.JobDate >= @From
And x.JobDate <= @To
Group By DriverID
, Day(JobDate)
, JobDate
Order By DriverID
, Day(JobDate);
A CROSS APPLY
将对每条记录执行内部子查询,其结果可以被 SELECT
.
引用
我有一个 MS SQL 2012 数据库 table 有 6 列
ID
JobDate DATETIME
DriverID INT
JobNUmber NVARCHAR(20)
JobStart TIME
JobEnd TIME
我正在尝试生成一个查询,该查询将为每个 driver 的每一天提供一行,其中包括日期、JobNumbers 的计数、最早的 JobStart 和最新的 JobEnd(这部分很简单)然后是总小时数和总分钟数以及总分钟数。第二部分我只有在每个特定的日子和 driver 分开工作时才能开始工作。 (哎呀!)
我收到错误消息“当子查询未使用 EXISTS 引入时,只能在 select 列表中指定一个表达式。
这就是我正在努力完成的工作。
DECLARE @mnth NVARCHAR(20) = 'Jan-16'
DECLARE @FROM NVARCHAR(20) = '2015-12-28'
DECLARE @TO NVARCHAR(20) = '2016-01-31'
SELECT @mnth AS 'Month',
x.DriverID As 'Driver',
DAY(x.JobDate) AS 'Day' ,
COUNT(x.JobNumber) AS 'Stops',
MIN(x.JobStart) AS 'Start',
MAX(x.JobEnd) AS 'End',
(SELECT
SUM(hrs) AS 'Hours', SUM(mins) AS 'Minutes', SUM(ABS(hrs * 60) + (ABS(mins))) AS 'Total Minutes'
FROM
( SELECT
ABS(SUM(E_hrs - S_hrs)) AS hrs,
ABS(SUM(E_mins - S_mins)) AS mins
FROM
(SELECT
DATEPART(HOUR,MIN(j.JobEnd)) AS E_hrs,
DATEPART(HOUR,MAX(j.JobStart)) AS S_hrs,
DATEPART(MINUTE,MAX(j.JobEnd)) AS E_mins,
DATEPART(MINUTE,MIN(j.JobStart)) AS S_mins
FROM Xora_Job_Time j
WHERE j.JobDate = x.JobDate
AND j.DriverID = x.DriverID
) a
) b
) c
FROM Xora_Job_Time x
WHERE x.JobDate >= @FROM
AND x.JobDate <= @TO
GROUP BY DriverID, DAY(JobDate), JobDate
ORDER BY DriverID, DAY(JobDate)
这部分效果很好!
DECLARE @mnth NVARCHAR(20) = 'Jan-16'
DECLARE @FROM NVARCHAR(20) = '2015-12-28'
DECLARE @TO NVARCHAR(20) = '2016-01-31'
SELECT @mnth AS 'Month',
x.DriverID As 'Driver',
DAY(x.JobDate) AS 'Day' ,
COUNT(x.JobNumber) AS 'Stops',
MIN(x.JobStart) AS 'Start',
MAX(x.JobEnd) AS 'End'
FROM Xora_Job_Time x
WHERE x.JobDate >= @FROM
AND x.JobDate <= @TO
GROUP BY DriverID, DAY(JobDate)
ORDER BY DriverID, DAY(JobDate)
并为我提供了我正在寻找的信息,但尝试添加时间计数导致此操作失败并出现 EXISTS 错误。
这行得通,但我每天都需要自己做 driver....
SELECT SUM(hrs)AS 'Hours', SUM(mins) AS 'Minutes', SUM(ABS(hrs * 60) + (ABS(mins))) AS 'Total Minutes'
FROM
( SELECT
ABS(SUM(E_hrs - S_hrs)) AS hrs,
ABS(SUM(E_mins - S_mins)) AS mins
FROM
(SELECT
DATEPART(HOUR,MIN(JobEnd)) AS E_hrs,
DATEPART(HOUR,MAX(JobStart)) AS S_hrs,
DATEPART(MINUTE,MAX(JobEnd)) AS E_mins,
DATEPART(MINUTE,MIN(JobStart)) AS S_mins
FROM Xora_Job_Time
WHERE JobDate = '2016-01-06'
AND DriverID = '3') a
) b
我得到的错误是带有 EXIST 的子查询,我看不到我需要 EXIST 子句的地方,更不用说它有帮助的地方了。
尽管如此,在此先感谢!
您不能在 SELECT
列表的子 select 中有多个记录。我想你要找的是 CROSS APPLY
:
Declare @Mnth NVarchar(20) = 'Jan-16';
Declare @From NVarchar(20) = '2015-12-28';
Declare @To NVarchar(20) = '2016-01-31';
Select @Mnth As 'Month'
, x.DriverID As 'Driver'
, Day(x.JobDate) As 'Day'
, Count(x.JobNumber) As 'Stops'
, Min(x.JobStart) As 'Start'
, Max(x.JobEnd) As 'End'
, c.Hours
, c.Minutes
, c.[Total Minutes]
From Xora_Job_Time x
Cross Apply (Select Sum(b.hrs) As 'Hours'
, Sum(b.mins) As 'Minutes'
, Sum(Abs(b.hrs * 60) + (Abs(b.mins))) As 'Total Minutes'
From (Select Abs(Sum(a.E_hrs - a.S_hrs)) As hrs
, Abs(Sum(a.E_mins - a.S_mins)) As mins
From (Select DatePart(Hour, Min(j.JobEnd)) As E_hrs
, DatePart(Hour, Max(j.JobStart)) As S_hrs
, DatePart(Minute, Max(j.JobEnd)) As E_mins
, DatePart(Minute, Min(j.JobStart)) As S_mins
From Xora_Job_Time j
Where j.JobDate = x.JobDate
And j.DriverID = x.DriverID
) a
) b
) c
Where x.JobDate >= @From
And x.JobDate <= @To
Group By DriverID
, Day(JobDate)
, JobDate
Order By DriverID
, Day(JobDate);
A CROSS APPLY
将对每条记录执行内部子查询,其结果可以被 SELECT
.