星期二, 6月 18, 2024

[SQL] 包含特定條件

論壇問題,把問題化為圖示如下


各 ID 資料內有 Status 為 Y 資料的話,要找出 ID 資料內的日期最大值

環境建置

發問者提供資料,剛好都是 Status = 'Y' 且該日期為最大值,故意加上 ID 005 資料,有 Status = 'Y' 但該筆資料日期不是 ID 內最大值
use tempdb
go 

DROP TABLE IF EXISTS tblA
DROP TABLE IF EXISTS tblB

CREATE TABLE tblA (ID char(3) , Name nchar(6))
INSERT INTO tblA (ID , Name) VALUES
('001' , N'王小明')  , ('002' , N'張小花') ,
('003' , N'李小壯')  , ('004' , N'黃小美') , 
('005' , N'自行加入')

CREATE TABLE tblB (ID char(3) , [Status] char(1) , [Date] date)
INSERT INTO tblB (ID , [Status] , [Date]) VALUES
('001' , 'N' , '2024-01-01') , ('001' , 'N' , '2024-01-10') , ('001' , 'Y' , '2024-01-28') ,
('002' , 'X' , '2024-03-10') , ('002' , 'N' , '2024-03-25') ,
('003' , 'N' , '2024-02-05') , ('003' , 'Y' , '2024-02-13') ,
('004' , 'N' , '2024-01-13') , ('004' , 'R' , '2024-01-25') ,
('005' , 'Y' , '2024-01-13') , ('005' , 'R' , '2024-01-25') -- 有 Y 存在,但 Y 日期並非是最大值

TSQL 解法

加入 ID 005資料
SELECT 
	A.*  , 
	IIF(IsIncludeY > 0 , MaxDate , NULL) AS [Date]
FROM tblA AS A
	JOIN
		(
			SELECT ID ,
				SUM(IIF([Status] = 'Y' , 1 , 0)) AS IsIncludeY ,
				MAX([Date]) AS MaxDate
			FROM tblB
			GROUP BY ID
		) AS B ON A.ID = B.ID

寫完發現發問者有變化需求,然後我也誤會題意,練習題就這樣吧,XD

沒有留言:

張貼留言