[英]Get MIN value between 3 columns on same row
雖然我已經為我正在尋找的東西提出了幾個可行的解決方案,但我想知道是否有更簡化的方法來確定單行中的 3 列中的哪一列包含最小/最小值。 以下是我正在使用的數據示例:
賬號 | 工作 | 自上次銷售以來的天數 | 自上次充電后的天數 | 成立天數 |
---|---|---|---|---|
YO502 | NULL | NULL | 5283 | NULL |
YO525 | NULL | 2303 | 2303 | 5917 |
ZE100 | 1個 | 190 | 449 | 707 |
ZE100 | 2個 | 160 | 279 | 615 |
ZI402 | NULL | 2109 | 2109 | NULL |
結果會是什么,這只是 DaysInactive 的新列,其中包含 3 個非空 DaysSincexxx 值中的較小者:
賬號 | 工作 | 自上次銷售以來的天數 | 自上次充電后的天數 | 成立天數 | 不活動天數 |
---|---|---|---|---|---|
YO502 | NULL | NULL | 5283 | NULL | 5283 |
YO525 | NULL | 2303 | 2303 | 5917 | 2303 |
ZE100 | 1個 | 190 | 449 | 707 | 190 |
ZE100 | 2個 | 160 | 279 | 615 | 160 |
ZI402 | NULL | 2109 | 2109 | NULL | 2109 |
這就是我所必須的,只是使用一系列 CASE 表達式來比較它們。 目標是根據與工作相關的 3 個不同日期值中的任何一個,找到客戶工作不活動天數的最低值。 需要明確的是,其中 2 列(DaysSinceLastSale 和 DaysSinceLastCharge)是主要目標,第 3 列(DaysSinceEstablished)是最后的手段,如果前 2 列是 NULL(所有 3 列實際上可以是 NULL,在這種情況下我們默認為 99999)。 我最終在 PowerBI 報告中使用了它,因此可以為最終用戶設置 >= 切片器以手動輸入記錄應該具有的最小非活動天數,以便在報告視覺上返回:
SELECT
CASE
WHEN COALESCE(DaysSinceLastSale, DaysSinceLastCharge) IS NOT NULL THEN
CASE WHEN COALESCE(DaysSinceLastSale, DaysSinceLastCharge) <= COALESCE(DaysSinceLastCharge, DaysSinceLastSale)
THEN COALESCE(DaysSinceLastSale, DaysSinceLastCharge)
ELSE COALESCE(DaysSinceLastCharge, DaysSinceLastSale)
END
ELSE COALESCE(DaysSinceEstablished, 99999)
END as DaysInactive
, DS.*
FROM #DS2 DS
這是我最初的解決方案,但我只是不喜歡所有的子查詢和 UNION:
SELECT
NormalizedDaysInactive.DaysInactive
, DS.*
FROM #DS2 DS
JOIN (
SELECT
AccountNumber, BillingLevel, Job, MIN(ISNULL(DaysInactive, 99999)) as DaysInactive
FROM
(
SELECT AccountNumber, BillingLevel, Job, MIN(DaysSinceLastSale) as DaysInactive FROM #DS2 GROUP BY AccountNumber, BillingLevel, Job
UNION ALL
SELECT AccountNumber, BillingLevel, Job, MIN(DaysSinceLastCharge) as DaysInactive FROM #DS2 GROUP BY AccountNumber, BillingLevel, Job
UNION ALL
SELECT AccountNumber, BillingLevel, Job, MIN(DaysSinceEstablished) as DaysInactive FROM #DS2 GROUP BY AccountNumber, BillingLevel, Job
) ActDays
GROUP BY AccountNumber, BillingLevel, Job
HAVING MIN(ISNULL(DaysInactive, 1)) > 0
) NormalizedDaysInactive ON NormalizedDaysInactive.AccountNumber = DS.AccountNumber
AND (NormalizedDaysInactive.Job = DS.Job OR NormalizedDaysInactive.BillingLevel = 'Account')
感謝任何建議! 謝謝
您可以使用 APPLY 進行一些“內聯”逆透視操作,然后獲取最小值。 我添加了TypeOfActivity
列,它可能會派上用場,以了解什么活動
SELECT *
FROM YourTable AS A
CROSS APPLY (
SELECT TOP(1) *
FROM (
VALUES
('Sale',DaysSinceLastSale)
,('Charge',DaysSinceLastCharge)
,('Established',DaysSinceEstablished)
) AS DTA(TypeOfActivity,DaysSinceActivity)
WHERE DaysSinceActivity IS NOT NULL
ORDER BY DaysSinceActivity
) AS B
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.