資料如下 , Dapartment是部門 , Flag是業績有沒有達標(要不要在MAIL中秀出這個部門)
Flag=1 即業績沒有達標,要顯示在MAIL中
Flag=0 即業績有達標,不要顯示在MAIL中
Flag都是已經算完判斷完的結果
簡單講就是 flag=1 的在寄信的內中顯示出來
Department | Flag |
---|---|
A | 0 |
B | 0 |
C | 1 |
D | 1 |
E | 0 |
F | 0 |
G | 1 |
H | 1 |
I | 0 |
舉例: EMAIL 信件內容 |
未達標部門 , C D G H , 請各單位主管注意
好現在問題來了,每一次Flag=1 的部門不一定 , 像這次有4各部門
如果在下次有6各部門=1 , 在在下次可能只有3各部門=1
簡單講每一次未達標得部門不一定,那麼在SQL中如果處理這種每一次達標數量不一定的方法
例1: 有4家flag=1 ,信件內容為 : 未達標部門 , C D G H , 請各單位主管注意
例2:下週有6家flag=1,信件內容為 : 未達標部門 ,A B C E G H , 請各單位主管注意
這個一定要用變數 ,在 MSSQL裡 , 我會寫成這樣
SET @MailBody=N'未達標部門'+ 變數控制(這裡要怎麼控制,因為每次要列的部門都不同)
+N',請各單位主管注意'
各位大大可自己設定變數,並且自己假定每次flag=1的部門不定
然後在下面這一段字中,可以彈性秀出每次達到Flag=1的部門名稱
未達標公司 (這裡要怎麼控制,因為每次要列的部門都不同),請各單位主管注意
(大家可以忽略MAIL這件事,重點在於動態秀出Flag=1的部門)
資料準備
Create Table S(
Department nchar(1),
flag int
)
INSERT INTO S
Values(N'A' , 0)
,(N'B' , 0)
,(N'C' , 1)
,(N'D' , 1)
,(N'E' , 0)
,(N'F' , 0)
,(N'G' , 1)
,(N'H' , 0)
,(N'I' , 1)
select * from S
create FUNCTION [CombineRowString_01]
(@flag nvarchar(max))
returns nvarchar(max)
begin
declare @str nvarchar(max)
set @str = ''
select @str = @str + TA.Department + ','
FROM S AS TA
where 1=1
AND TA.flag = @flag
set @str = ',' + replace(cast(@str AS nvarchar(max)),' ','')
return @str
end
SELECT DISTINCT 1 as flag,STUFF(
(
left(dbo.CombineRowString_01(1),len(dbo.CombineRowString_01(1))-1 )
),1,1,'') as 'Department'
FROM S AS A