我正在嘗試撰寫一個查詢,該查詢將使一列根據另一個逗號分隔的列顯示特定值。這些代碼旨在表示常規時間/加班/雙倍時間/等,它們來自前面提到的逗號分隔列。在原始視圖中,每個不同的小時數都有單獨的列。
我原來的觀點是這樣的:
| 員工全名 | 代碼 | 正常時間 | 雙倍時間 | 隨著時間的推移 |
|---|---|---|---|---|
| 約翰·多伊 | 甲、乙 | 10 | 5 | 0 |
| 簡·多伊 | 乙 | 5 | 0 | 0 |
我的查詢輸出什么:
| 員工全名 | 代碼 | 小時 |
|---|---|---|
| 約翰·多伊 | 甲、乙 | 10 |
| 約翰·多伊 | 甲、乙 | 5 |
| 簡·多伊 | 乙 | 5 |
我希望輸出的樣子:
| 員工全名 | 代碼 | 小時 |
|---|---|---|
| 約翰·多伊 | 一種 | 10 |
| 約翰·多伊 | 乙 | 5 |
| 簡·多伊 | 乙 | 5 |
它看起來像在第一個表中的樣子,因為目前它只是從常規時間列中提取。我曾嘗試使用 case switch 讓它尋找特定的代碼,然后提取數字,但無論我如何撰寫,我都會遇到各種錯誤。這是我的查詢的樣子:
SELECT [Employee_FullName],
SUBSTRING(col, 1, CHARINDEX(' ', col ' ' ) -1)'Code',
hrsValue
FROM
(
SELECT [Employee_FullName], col, hrsValue
FROM myTable
CROSS APPLY
(
VALUES ([Code],[RegularHours])
) C (COL, hrsValue)
) SRC
Any advice on how to fix it or perspective on what to use is appreciated!
Edit: I cannot change the comma delimited data, it is provided that way. I think a case within a cross apply will solve it but I honestly don't know.
uj5u.com熱心網友回復:
您可以使用以下代碼拆分值
- 注意如果它回傳 0 是如何
NULLIF空的CHARINDEX - 秒的后半部分以
APPLYnull 為條件
SELECT
t.[Employee_FullName],
Code = TRIM(v2.Code),
v2.Hours
FROM myTable t
CROSS APPLY (VALUES( NULLIF(CHARINDEX(',', t.Code), 0) )) v1(comma)
CROSS APPLY (
SELECT Code = ISNULL(LEFT(t.Code, v1.comma - 1), t.Code), Hours = t.RegularTime
UNION ALL
SELECT SUBSTRING(t.Code, v1.comma 1, LEN(t.Code)), t.DoubleTime
WHERE v1.comma IS NOT NULL
) v2;
資料庫<>小提琴
uj5u.com熱心網友回復:
如果您使用的是 SQL Server 2016 或更高版本,則可以使用OPENJSON()拆分代碼值而不是繁瑣的字串操作:
SELECT t.Employee_FullName,
Code = LTRIM(j.value),
Hours = MAX(CASE j.[key]
WHEN 0 THEN RegularTime
WHEN 1 THEN DoubleTime
WHEN 2 THEN Overtime END)
FROM dbo.MyTable AS t
CROSS APPLY OPENJSON('["' REPLACE(t.Code,',','","') '"]') AS j
GROUP BY t.Employee_FullName, LTRIM(j.value);
- 示例資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323653.html
標籤:sql sql-server tsql
上一篇:帶有STUFF和XML路徑的WHERE子句tsql中的動態LIKE
下一篇:僅獲取每個名稱具有最新日期的行
