在T-SQL中对分组使用逻辑功能

问题描述

是否可以使用t-sql中的组来评估OR或AND逻辑函数

DECLARE @TimeClock TABLE 
                   (
                       EName  NVARCHAR(14),Time   NVARCHAR(5),OnTime tinyint
                   )
    
INSERT INTO @TimeClock VALUES ('Adam','07:55',1)
INSERT INTO @TimeClock VALUES ('Adam','08:03',0)
INSERT INTO @TimeClock VALUES ('Bob','07:57',1)
INSERT INTO @TimeClock VALUES ('Bob','07:59',1)
INSERT INTO @TimeClock VALUES ('Carl','08:01',0)
INSERT INTO @TimeClock VALUES ('Carl','08:02',0)

SELECT    
    EName,OR(OnTime) AS SometimesLate,AND(OnTime) AS AlwaysLate,NOT(OR(OnTime)) AS NeverLate
FROM 
    @TimeClock
GROUP BY 
    EName

一个非常简单的情况下,我可以这样做:

SELECT    
    tc.EName,IIF(n.EName IS NOT NULL,1,0) AS SometimesLate,IIF(o.EName IS NULL,0) AS AlwaysLate,IIF(n.EName IS NULL,0) AS NeverLate
FROM 
    (SELECT disTINCT EName FROM @TimeClock) tc
LEFT JOIN 
    (SELECT disTINCT EName FROM @TimeClock WHERE OnTime = 1) o ON o.EName = tc.EName
LEFT JOIN 
    (SELECT disTINCT EName FROM @TimeClock WHERE OnTime = 0) n ON n.EName = tc.EName

但是如果我有很多不同的列(例如,OnTime,延迟5分钟,延迟10分钟等),则会变得非常费力。

enter image description here

解决方法

某些数据库具有布尔聚合功能(例如Postgres),但SQL Server并非其中之一。

但是,这里不需要那种复杂的逻辑。我们可以使用ScriptApp.getService().getUrl()MIN()和基本算术来模拟布尔聚合,如下所示:

MAX()