我正在使用 Microsoft SQL Server Management Studio,并且我想要一個計算以下內容的新列:
- 如果它具有類別的“Exec”值,則采用“結束日期”。
- 如果它具有類別的“范圍”值,則采用“開始日期”。
這個新列計算這兩者之間的月數。
我希望 SQL 對給定的 id 進行計算,因此每個 id 都會計算出不同的值。
目前它需要整個表格的最小結束日期和最小“開始日期”。
SELECT
id, category, startdate, enddate,
CASE
WHEN id = id
THEN DATEDIFF(month,
(SELECT MIN(enddate) from [A].[PP] where category = 'Exec'),
(SELECT MIN(startdate) from [A].[PP] where category = 'Scop')) --AS datemodify
ELSE NULL
END
FROM
[A].[PP]
WHERE
startdate IS NOT NULL
AND (category = 'Exec' OR category = 'Scop')
ORDER BY
id ASC
它目前產生的結果:
| ID | 類別 | 開始日期 | 結束日期 | 新專欄 |
|---|---|---|---|---|
| 1 | 范圍 | 2022-11-1 | 2022-10-1 | 11 |
| 1 | 執行 | 2023-11-1 | 2023-10-1 | 11 |
| 2 | 范圍 | 2022-11-1 | 2022-10-1 | 11 |
| 2 | 執行 | 2023-11-1 | 2023-09-1 | 11 |
我想要的結果:
| ID | 類別 | 開始日期 | 結束日期 | 新專欄 |
|---|---|---|---|---|
| 1 | 范圍 | 2021-11-1 | 2022-10-1 | 24 |
| 1 | 執行 | 2023-11-1 | 2023-11-1 | 24 |
| 2 | 范圍 | 2022-11-1 | 2022-10-1 | 11 |
| 2 | 執行 | 2023-11-1 | 2023-09-1 | 11 |
uj5u.com熱心網友回復:
根據評論,我不確定你是否仍然知道你想要作為你的輸出,所以我想出了兩個不同的版本。
以下是我創建資料集版本的方式:
INSERT INTO #TempTable (ID, Category, StartDate, EndDate)
VALUES (1, 'Scop', '2021-11-01', '2022-10-01'),
(1, 'Exec', '2023-11-01', '2023-10-01'),
(2, 'Scop', '2022-11-01', '2022-10-01'),
(2, 'Exec', '2023-11-01', '2023-10-01');
這是第一個版本,它為每個 ID 創建了兩行,但是從不同的行中破解了 StartDate 和 EndDate。這可以通過直接從臨時表中選擇所有資料來作業,然后繼續說該行是否為 Category = Scop 然后DateDiff在 StartDate 之間執行一個操作,然后從 ID 匹配且 Category = 的子查詢中獲取 EndDate Exec(它也應用了相同的邏輯,但在初始 Category = Exec 的情況下相反):
SELECT TT.ID,
TT.Category,
TT.StartDate,
TT.EndDate,
CASE
WHEN TT.Category = 'Scop' THEN DATEDIFF(M, TT.StartDate, (SELECT EndDate FROM #TempTable WHERE Category = 'Exec' AND ID = TT.ID))
ELSE CASE
WHEN TT.Category = 'Exec' THEN DATEDIFF(M, (SELECT StartDate FROM #TempTable WHERE Category = 'Scop' AND ID = TT.ID), TT.EndDate)
END
END AS DateDiffCalc
FROM #TempTable AS TT;
此版本將 ID 壓縮到單行,它最初只獲取 Scop 資料,但隨后使用 ID 和具體資訊連接回自身以僅獲取 Exec 資料。現在您可以DateDiff在 Scop StartDate 和 Exec EndDate 之間
SELECT DISTINCT t1.ID,
t1.Category,
t1.StartDate,
T2.Category,
T2.EndDate,
DATEDIFF(M, t1.StartDate, T2.EndDate) AS DateDiffCalc
FROM #TempTable AS t1
INNER JOIN #TempTable AS T2 ON T2.ID = T2.ID AND T2.Category = 'Exec'
WHERE t1.Category = 'Scop'
ORDER BY t1.ID;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/524332.html
標籤:sqlsql服务器
上一篇:如何解決將資料型別varchar轉換為bigint時出錯。查詢是從Table1中選擇ID,其中'0123456789'like'%' ID '%
