2017-09-25 45 views
0

我有一個24小時數據表,我想要透視數據並根據計數爲他們分配一個等級。UNPIVIOT AND RANK的數據

create table #HourlyData_Counts 
(Hr_1 int,Hr_2 int ,Hr_3 int,Hr_4 int,Hr_5 int ,Hr_6 int ,Hr_7 int , Hr_8 int ,Hr_9 int , Hr_10 int) 

insert into #HourlyData_Counts 
values (55,89,78,77,67,99,45,33,23,91) 

select * from #HourlyData_Counts 

--drop table #HourlyData_Counts 

所需的輸出

enter image description here

+0

如果你想在行,你爲什麼把值列中的數據? –

回答

1

您需要在這種情況下使用逆透視。

select Hours,counts,Ranks=Row_Number()over(order by counts) 
from 
(
    select * from #HourlyData_Counts 
) src 
UNPIVOT 
(
    counts For Hours in(Hr_1,Hr_2,Hr_3,Hr_4,Hr_5,Hr_6,Hr_7,Hr_8,Hr_9,Hr_10) 
) unpiv; 

enter image description here

0

您正在尋找unpivot的,就像這樣:

select 
    [Hours], 
    [counts], 
    rank() over (order by [counts] desc) 
from 
(
    select * from #HourlyData_Counts 
) as src 
unpivot 
(
    [counts] for [Hours] in (Hr_1, Hr_2, Hr_3, Hr_4, Hr_5, Hr_6, Hr_7, Hr_8, Hr_9, Hr_10) 
) as upvt 
order by try_cast(replace([Hours], 'Hr_', '') as int) 
0
CREATE TABLE #HourlyData_Counts 
(Hr_1 int,Hr_2 int ,Hr_3 int,Hr_4 int,Hr_5 int ,Hr_6 int ,Hr_7 int , Hr_8 int ,Hr_9 int , Hr_10 int) 

INSERT INTO #HourlyData_Counts 
VALUES (55,89,78,77,67,99,45,33,23,91) 

SELECT 
    [Hours] 
    , Counts 
    , RANK() OVER (ORDER BY Counts DESC) Ranks 
FROM 
    (
     SELECT Hr_1, Hr_2, Hr_3, Hr_4, Hr_5, Hr_6, Hr_7, Hr_8, Hr_9, Hr_10 
     FROM #HourlyData_Counts 
    ) P 
    UNPIVOT 
     (
      Counts FOR [Hours] IN 
      (Hr_1, Hr_2, Hr_3, Hr_4, Hr_5, Hr_6, Hr_7, Hr_8, Hr_9, Hr_10) 
     ) U 
ORDER BY CAST(REPLACE([Hours], 'Hr_', '') AS int) 

DROP TABLE #HourlyData_Counts 
0
IF OBJECT_ID('tempdb..#HourlyData_Counts') IS NOT NULL 
DROP TABLE #HourlyData_Counts 
create table #HourlyData_Counts 
(Hr_1 int,Hr_2 int ,Hr_3 int,Hr_4 int,Hr_5 int ,Hr_6 int ,Hr_7 int , Hr_8 int ,Hr_9 int , Hr_10 int) 

insert into #HourlyData_Counts 
values (55,89,78,77,67,99,45,33,23,91) 

select * from #HourlyData_Counts 


SELECT hours,hour1, RANK() OVER (order by hour1 desc) as RANK 
FROM 
(
    SELECT Hr_1, Hr_2, Hr_3, Hr_4, Hr_5, Hr_6, Hr_7, Hr_8, Hr_9, Hr_10 
      FROM #HourlyData_Counts 

) as s 
UNPIVOT 
(
    hour1 
    FOR hours IN 
(
Hr_1,Hr_2,Hr_3,Hr_4,Hr_5,Hr_6,Hr_7,Hr_8,Hr_9,Hr_10 
) 
)AS pvt 
order by hours 
0

可以使用UNPIVOT對於這一點,所以你的查詢768,16這個樣子

SELECT hr,counts, RANK() OVER(ORDER BY counts DESC) FROM 
(SELECT * FROM #HourlyData_Counts) p 
    UNPIVOT 
(counts FOR hr IN (Hr_1 ,Hr_2 ,Hr_3 ,Hr_4 ,Hr_5 ,Hr_6 ,Hr_7 , Hr_8 ,Hr_9 , Hr_10 ))AS unpvt; 

結果

Hr_6 99 1 
Hr_10 91 2 
Hr_2 89 3 
Hr_3 78 4 
Hr_4 77 5 
Hr_5 67 6 
Hr_1 55 7 
Hr_7 45 8 
Hr_8 33 9 
Hr_9 23 10 
0

如果列和列名的數量是固定的,那麼你可以使用

;with r(hr, data_count) as (
    select 'hr_1', hr_1 from #HourlyData_Counts union all 
    select 'hr_2', hr_2 from #HourlyData_Counts union all 
    select 'hr_3', hr_3 from #HourlyData_Counts union all 
    select 'hr_4', hr_4 from #HourlyData_Counts union all 
    select 'hr_5', hr_5 from #HourlyData_Counts union all 
    select 'hr_6', hr_6 from #HourlyData_Counts union all 
    select 'hr_7', hr_7 from #HourlyData_Counts union all 
    select 'hr_8', hr_8 from #HourlyData_Counts union all 
    select 'hr_9', hr_9 from #HourlyData_Counts union all 
    select 'hr_10', hr_10 from #HourlyData_Counts 
) 
select hr, data_count, data_rank = ROW_NUMBER() over(order by data_count asc) 
    from r 
order by data_count