[英]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.