簡體   English   中英

在 T-SQL 中使用邏輯函數進行分組

[英]Using logical functions on grouping in 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, 1, 0) AS AlwaysLate,
    IIF(n.EName IS NULL, 1, 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 分鍾等),那將變得非常密集。

在此處輸入圖像描述

有些數據庫有boolean聚合函數(如Postgres),但SQL Server不是其中之一。

但是,這里不需要那么復雜的邏輯。 我們可以使用MIN()MAX()和基本算術模擬 boolean 聚合,如下所示:

select    
    ename,
    1 - min(ontime) as sometimeslate,
    1 - max(ontime) as alwayslate,
    min(ontime) as neverlate
from @timeclock
group by ename

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM