[英]t-sql pivot filter based on input column name
基於以下AreaState表
Area State
-------------------
A1 Active
A1 Active
A1 Active
A1 Proposed
A1 Proposed
A2 Active
A2 Proposed
我想編寫一個存儲的proc,它返回每個區域的狀態計數。 輸入到存儲的proc的是任何有效的State(在這種情況下,@ state是輸入參數)。 我希望下面的方法可以工作,但不能。
declare @state varchar(10)
set @state = 'Active'
select Area, QUOTENAME(@state)
from
(
select Area, State from AreaState
) as src
pivot
(
count(State) for State in (QUOTENAME(@state))
) as pvt
請 建議。
我在等待反饋時可能有錯誤的要求,但我認為您可以使用簡單的GROUP BY查詢。
碼:
SELECT Area, State, Count(*) as 'Count'
FROM x
GROUP BY Area, State
測試用例:
WITH x AS (
SELECT 'A1' as Area, 'Active' as State
UNION ALL
SELECT 'A1' as Area, 'Active' as State
UNION ALL
SELECT 'A1' as Area, 'Active' as State
UNION ALL
SELECT 'A1' as Area, 'Proposed' as State
UNION ALL
SELECT 'A1' as Area, 'Proposed' as State
UNION ALL
SELECT 'A2' as Area, 'Active' as State
UNION ALL
SELECT 'A2' as Area, 'Proposed' as State
)
SELECT Area, State, Count(*) as 'Count'
FROM x
GROUP BY Area, State
輸出:
Area State Count
------------------------
A1 Active 3
A1 Proposed 2
A2 Active 1
A2 Proposed 1
我不確定這是否是最佳方法,但確實可以解決問題。
declare @state varchar(20)
set @state = 'Proposed'
create table #tt_Result
(
Area varchar(max),
[Active] int,
[Proposed] int
)
insert into #tt_Result
select Area, [Active], [Proposed]
from
(
select Area, State from AreaState
) as src
pivot
(
count(State) for State in ([Active], [Proposed])
) as pvt
select Area,
case
when @state = 'Active' then [Active]
when @state = 'Proposed' then [Proposed]
end as [Count]
from #tt_Result
drop table #tt_Result
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.