在case语句SQL Server中使用convert函数

时间:2018-05-17 16:21:40

标签: sql-server tsql case

我正在尝试创建SQL查询以从我的数据库生成报告。

每隔五分钟或更长时间,我的数据库中会添加一个新条目,该条目的长度,采取的时间以及采取的时间。

以前有这段代码:

SELECT 
    SUM(DataEntry.Length) AS Length, 
    COUNT(DISTINCT MicrotecDataEntry.DateTime) AS NumberTimeEntry, 
    Shift,
    CONVERT(DATE, DATEADD(mi, -360, DateTime)) AS Expr1
FROM            
    DataEntry 
WHERE       
    (DateTime > DATEADD(d, - 28, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE()))))))  
    AND (DateTime < DATEADD(d, - 0, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE()))))))
GROUP BY  Shift, 
    CONVERT(date, DATEADD(mi, - 360, MicrotecDataEntry.DateTime))

我们的夜班是在两个不同的日子,所以为了在一个生产日保留它,我们从该日期起删除了6个小时,因此夜班从那天起00:00 AM开始。

但是由于某些原因,我必须为夜班移除12小时,为其他班次移除6小时。所以我想做点什么:

SELECT 
    SUM(ataEntry.Length) AS Length, 
    COUNT(DISTINCT DateTime) AS NumberTimeEntry, 
    MicrotecTimeQuarter.Shift, 
    CASE  
       WHEN MicrotecTimeQuarter.Shift = 'shift 2'
          THEN CONVERT(DATE, DATEADD(mi, -720, DateTime))
          ELSE CONVERT(DATE, DATEADD(mi, -360, DateTime))
    END AS Expr1
FROM    
   DataEntry 
MicrotecTimeQuarter.Id
WHERE  
    (DateTime > DATEADD(d, - 7, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE())))))) 
    AND (DateTime < DATEADD(d, - 0, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE())))))) 

GROUP BY Shift, 
    CASE  
       WHEN Shift = 'shift 2'
          THEN CONVERT(DATE, DATEADD(mi, -720, DateTime))
          ELSE CONVERT(DATE, DATEADD(mi, -360, DateTime))
   END 

但似乎语法不正确,我收到了消息

  

MicrotechDataEntry.DateTime在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

我是SQL的新手,所以我不知道问题出在哪里。对于导致问题的原因以及如何解决问题有任何了解吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您不能在case语句中使用DateTime字段,因为它不是分组的一部分。一种解决方案是将您的计算字段放在子查询中,将该组放在更高级别。

SELECT
    SUM(X.Length) AS Length, 
    COUNT(DISTINCT MDE.DateTime) AS NumberTimeEntry, 
    MTQ.Shift, 
    Expr1
FROM
(
    SELECT
        MDE.DateTime,
        MDE.Length,
        MQT.Shift,
        Expr1 = CASE WHEN MTQ.Shift='shift 2'then    CONVERT(date, DATEADD(MINUTE, -    720, MDE.DateTime)) ELSE CONVERT(date, DATEADD(MINUTE, - 360, MDE.DateTime)) END 
    FROM
        MicrotecDataEntry MDE 
        INNER JOIN MicrotecTimeQuarter MTQ ON MDE.MicrotecTimeQuarterId = MTQ.Id
    WHERE
        (MDE.DateTime > DATEADD(d, - 7, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE())))))) 
        AND 
        (MDE.DateTime < DATEADD(d, - 0, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE())))))) 
        AND 
        (MDE.MicrotecProductId <> 4)
)AS X
GROUP BY
    Shift,
    Expr1