iT邦幫忙

0

MSSQL 不定變數達到條件,顯示的方法

資料如下 , 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
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
rogeryao
iT邦超人 8 級 ‧ 2019-12-20 15:51:25
最佳解答
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

DEMO

twyes iT邦新手 4 級 ‧ 2019-12-20 16:09:29 檢舉

感謝 (我再研究一下大大的寫法)
請問一下,有辦法控制逗點間格嗎
例如 C,D,G,I ==> 逗點前後各一個空格

rogeryao iT邦超人 8 級 ‧ 2019-12-20 16:14:53 檢舉
SELECT DISTINCT 1 as flag,
replace(STUFF(
(
left(dbo.CombineRowString_01(1),len(dbo.CombineRowString_01(1))-1 )
),1,1,''),',',' , ') as 'Department'
FROM S AS A

Demo

twyes iT邦新手 4 級 ‧ 2019-12-20 16:20:40 檢舉

哈哈,真的很感謝大大,每次都有解答到我的問題

我要發表回答

立即登入回答