我在SQL Server 2016中有一個表,它保存了整個作業日的會議安排。它在一列中為一周中的每一天存盤日子(下面的例子)。我想查詢該表,并以更方便用戶的格式在單列中獲得結果。
目前,資料是這樣存盤在表中的:
SCHEDULE TABLE:
MEETING_TITLE | MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FIDAY
FOO | NULL | Y | NULL | Y | NULL
我的愿望是在結果中結合這些作業日列,并將它們轉換為各自的日期縮寫。
期望的結果:
SCHEDULE TABLE:
MEETING_TITLE | MEETING_DAYS
FOO | T/THU
我研究了case陳述句和if/else,并嘗試用宣告變數的方式來保存數值,但到目前為止都沒有成功。為了證明我的解決嘗試,我特別嘗試宣告一個變數來保存格式化的日子。之后,我試圖為每一天做一個if/else,在這一欄中尋找'Y'。如果找到了,我希望做一個 =的事情,根據需要合并這些值。我所嘗試的一切都導致了錯誤,查詢無法運行。
我希望得到任何這方面的幫助。
(以上例子當然是簡化的,這個表比上面的要復雜得多)
uj5u.com熱心網友回復:
這個版本只在SQL Server 2017或以上版本中作業(或者如果你使用自定義字串agg函式)。
另一種可能是交叉應用:
select s.*, v.*
from schedule s cross apply
(select string_agg(name, '/') within group (order by ord) as meeting_days
from (values ('M', Monday, 1),
('T', Tuesday, 2),
('W', Wednesday, 3),
('Thu', Thursday, 4),
('F', Friday, 5)
) v(name, val, ord)
where val = 'Y'>
uj5u.com熱心網友回復:
--你可以使用CASE陳述句來連接,然后。
--使用STUFF和REVERSE的組合來洗掉[MEETING_DAYS]的尾部/關閉。
SELECT [MEETING_TITLE], reverse(stuff(reverse( )
CASE WHEN [星期一] IS NULL THEN ''/span> ELSE 'Mon/' END
CASE WHEN [星期二] IS NULL THEN ''/span> ELSE 'T/' END
CASE WHEN [星期三] IS NULL THEN '' ELSE '星期三/' END
CASE WHEN [星期四] IS NULL THEN ''/span> ELSE 'THU/' END
CASE WHEN [星期五] IS NULL THEN '' ELSE 'Fri/' END)。) 1, 1, '') AS [MEETING_DAYS]
FROM [dbo].[Schedule].
uj5u.com熱心網友回復:
請嘗試以下解決方案。
值得注意的是。
值得注意的是:
- 我們正在將感興趣的列標記為XML. 。
FOR XML ...自動過濾掉具有NULL值的列。- 開始的3個字符被用來縮寫每個星期的日子。
SQL
--DDL和樣本資料人口,開始。
DECLARE @tbl TABLE (
ID INT IDENTITY PRIMARY KEY,
meeting VARCHAR(100)。
星期一 CHAR(1)。
星期二 CHAR(1)。
周二 CHAR(1) 。
星期四 CHAR(1) 。
星期五 CHAR(1)
);
INSERT INTO @tbl (meeting,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY) VALUES
('FOO', NULL, 'Y', NULL,'Y',NULL)。)
('New Meeting', 'Y','Y', NULL,'Y',NULL)。)
-- DDL和樣本資料人口,結束。
SELECT ID, meeting
, REPLACE(c.query('
for $x in /root/*
return substring(local-name($x),1,3)
').value('. ', 'VARCHAR(100)'), SPACE(1),'/') AS MEETING_DAYS
FROM @tbl
CROSS APPLY (Select MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
FOR XML PATH(''), TYPE, ROOT('root') AS t(c)。
輸出
---- ------------- -------------- 。
| ID | meeting | MEETING_DAYS |
---- ------------- --------------
| 1 | FOO | TUE/THU |
| 2 | New Meeting | New 操作員">| MON/TUE/THU |
---- ------------- --------------
uj5u.com熱心網友回復:
如果你使用的是SQL 2017或更高版本,一個簡單的完成方式是
select meeting_title,
Concat_Ws('/',
Iif(星期一 is null,null,'Mon'),
Iif(星期二 是 null,null,'tue')。
Iif(星期三 是 null,null,'wed'),
Iif(thursday is null,null,'thu') 。
Iif(星期五 是 null,null,'fri')
) as meeting_days
from schedule
uj5u.com熱心網友回復:
用樣本資料:
Declare @testData table (
meeting_title varchar(20)
, 星期一 char(1)
, 星期二 char(1)
, 星期三 char(1)
, 星期四 char(1)
, 星期五 char(1)
);
Insert Into @testData (meeting_title, Monday, Tuesday, Wednesday, Thursday, Friday)
Values ('FEE'/span>, Null, 'Y', Null, 'Y', Null)
, ('FIE'/span>, 'Y'/span>, Null, 'Y', 'Y', Null)
, ('FOE'/span>, 'Y'/span>, 'Y'/span>, Null, Null, 'Y')。)
Select *
, meeting_days = stuff(concat('/'/span> iif(td. Monday = 'Y'/span>, 'Mon'/span>, Null)
, '/' iif(td. Tuesday = 'Y'/span>, 'Tue'/span>, Null)
, '/' iif(td. Wednesday = 'Y', 'Wed', Null)
, '/' iif(td. Thursday = 'Y'/span>, 'Thu'/span>, Null)
, '/' iif(td. Friday = 'Y'/span>, 'Fri', Null)), 1, 1, ')
From @testData td;
uj5u.com熱心網友回復:
注意:這是Oracle的語法,不是sql-server。 無論如何,把它留在這里是為了讓其他可能喜歡它的人把它作為一個Oracle答案。
select meeting_title
, CONCAT( decode( monday, 'Y', 'M' ),',
decode( tuesday, 'Y', 'T' ),' ',
decode( 星期三, 'Y', 'W' ) ,' ',
decode( thursday, 'Y', 'Th' ) ,' ',
decode( friday, 'Y', 'F' ) )
from my_schedule
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323124.html
標籤:
上一篇:在不使用#temp表的情況下,在DataFrame和SQLServer表之間進行JOIN。
下一篇:SwiftUI--圓形文本欄位
