【问题标题】:MS SQL, Subqueries and EXISTS ERRORMS SQL、子查询和存在错误
【发布时间】:2017-02-08 04:19:47
【问题描述】:

我有一个 MS SQL 2012 数据库,该表有 6 列

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 的子查询,我看不到我想要 EXIST 子句的地方,更不用说它有帮助的地方了。

不过还是先谢谢了!

【问题讨论】:

    标签: sql sql-server subquery exists


    【解决方案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 可以引用其结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-26
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多