我想撰寫一個查詢來從表中檢索結果。
當名字我的所有狀態都完成時顯示我已完成。當狀態已完成但還有其他狀態(例如進行中或已創建)時,則僅顯示其他狀態
| 自定義名稱 | 地位 | 命令 |
|---|---|---|
| 伊萬·伊萬諾夫 | 完全的 | 1 |
| 斯托克諾夫 | 完全的 | 1 |
| 迪米蒂爾·伊萬諾夫 | 完全的 | 1 |
| 伊萬·伊萬諾夫 | 完全的 | 2 |
| 迪米蒂爾·伊萬諾夫 | 完全的 | 2 |
| 伊萬·伊萬諾夫 | 進行中 | 2 |
| 斯托克諾夫 | 完全的 | 2 |
| 迪米蒂爾·伊萬諾夫 | 完全的 | 3 |
| 迪米蒂爾·伊萬諾夫 | 創建 | 4 |
| 斯托克諾夫 | 完全的 | 3 |
| 伊萬·伊萬諾夫 | 完全的 | 4 |
| 斯托克諾夫 | 完全的 | 4 |
預期結果
| 伊萬·伊萬諾夫 | 進行中 |
| 迪米蒂爾·伊萬諾夫 | 創建 |
| 斯托克諾夫 | 完全的 |
詢問:
SELECT distinct CustomName,
(CASE WHEN [STATUS] ='COMPLETED' THEN 'completed'
WHEN [STATUS] ='inprocess' THEN 'inprocess'
WHEN [STATUS] ='created' THEN 'created' END ) AS [STATUS]
from [dbo].[Customers]
uj5u.com熱心網友回復:
您可以執行以下操作,計算每個客戶的每種狀態有多少,然后按優先順序選擇要顯示的狀態。
declare @Test table (CustomName varchar(32), [STATUS] varchar(32), [Order] int)
insert into @Test (CustomName, [STATUS], [Order])
values
('Ivan Ivanov', 'completed', 1),
('Stoqn Stoqnov', 'completed', 1),
('Dimityr Ivanov', 'completed', 1),
('Ivan Ivanov', 'completed', 2),
('Dimityr Ivanov', 'completed', 2),
('Ivan Ivanov', 'inprocess', 2),
('Stoqn Stoqnov', 'completed', 2),
('Dimityr Ivanov', 'completed', 3),
('Dimityr Ivanov', 'created', 4),
('Stoqn Stoqnov', 'completed', 3),
('Ivan Ivanov', 'completed', 4),
('Stoqn Stoqnov', 'completed', 4);
with cte as (
select CustomName
, sum(case when [status] = 'completed' then 1 else 0 end) over (partition by CustomName) Completed
, sum(case when [status] = 'created' then 1 else 0 end) over (partition by CustomName) Created
, sum(case when [status] = 'inprocess' then 1 else 0 end) over (partition by CustomName) InProcess
from @Test
)
select CustomName
-- This logic could be more complex if desired
, case when InProcess > 0 then 'In Process' when Created > 0 then 'Created' else 'Completed' end
from cte
group by CustomName, Completed, Created, InProcess;
回報:
| 自定義名稱 | 地位 |
|---|---|
| 迪米蒂爾·伊萬諾夫 | 已創建 |
| 伊萬·伊萬諾夫 | 進行中 |
| 斯托克諾夫 | 完全的 |
注意:提供如我所展示的 DDL DML,使人們更容易提供幫助。
uj5u.com熱心網友回復:
我不認為這需要視窗函式或交叉連接,只是一個簡單GROUP BY的條件計數
SELECT
CustomName,
CASE WHEN COUNT(CASE WHEN [status] = 'created' THEN 1 END) > 0 THEN 'Created'
WHEN COUNT(CASE WHEN [status] = 'inprocess' THEN 1 END) > 0 THEN 'In Process'
ELSE 'Completed' END
FROM YourTable t
GROUP BY t.CustomName;
uj5u.com熱心網友回復:
嘗試以下操作:
這個想法是用來cte查找所有包含不同型別狀態的客戶名稱
然后用于UNION ALL查找所有僅包含“已完成”狀態的客戶名稱
;WITH cte AS (
SELECT DISTINCT CustomName, [STATUS]
FROM [dbo].[Customers]
WHERE [STATUS] <> 'Completed'
)
SELECT *
FROM cte
UNION ALL
SELECT DISTINCT CustomName, [STATUS]
FROM [dbo].[Customers]
WHERE CustomName NOT IN (SELECT CustomName FROM cte)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/415080.html
標籤:
上一篇:添加缺失的資料
