如何解决在T-SQL中对分组使用逻辑功能
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分钟等),则会变得非常费力。
解决方法
某些数据库具有布尔聚合功能(例如Postgres),但SQL Server并非其中之一。
但是,这里不需要那种复杂的逻辑。我们可以使用ScriptApp.getService().getUrl()
,MIN()
和基本算术来模拟布尔聚合,如下所示:
MAX()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。