2016-09-29 71 views
0

我有一个MS SQL 2012数据库中的表有6列MS SQL,子查询和EXISTS ERROR

ID 
JobDate DATETIME 
DriverID INT 
JobNUmber NVARCHAR(20) 
JobStart TIME 
JobEnd TIME 

我想生成一个查询,会给我一个单独的行,每一天对于每个驱动程序有一天,JobNumbers的数量,最早的JobStart和最新的JobEnd(这部分很简单),然后是总小时数和总分钟数以及总分钟数。第二部分,我只能分别工作,如果我每个具体的一天和驱动程序。 (伊克!)

我正在这里“只有一个表达式可以在选择列表时,子查询不与EXISTS引入指定的错误。

这是我想作的工作。

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错误。

这工作,但我需要通过自己做的每一天,司机....

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子句远不及它的帮助。

然而,在此先感谢!

回答

1

你不能在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); 

一个CROSS APPLY将执行内部子查询中的每个记录,其结果则可以通过SELECT引用。