2013-04-28 103 views
2

我使用SQL Server 2012中,需要生成柱狀圖,概念上類似於Google's screener生成SQL Server中的直方圖

的想法是把所有的價格分割成100個大小相等的(根據價格)桶,然後每個存儲桶包含在存儲桶的最小值和最大值內定價的多個項目。 NTILE沒有工作 - 它試圖在桶之間平均分配項目(基於數量)。

所以,這是我到目前爲止有:

select bucket, count(*) from (select cast((PERCENT_RANK() OVER(ORDER BY Price DESC)) * 100 as int) as bucket from MyTable 
where DataDate = '4/26/2012') t group by bucket 

這是產生在SQL Server 2012中的直方圖的好辦法?有沒有什麼內置的SQL Server 2012來完成這項任務或更好的方法?

謝謝

+1

「* ..將所有價格拆分爲100個同等大小(基於價格)的桶。*」要做到這一點,您需要確定(或需要一些規則來確定)這些價格範圍100桶。 – RBarryYoung 2013-04-28 22:29:02

+0

我的理解是,PERCENT_RANK給了我們一個集合中某個值的百分比位置。在這種情況下,價值是價格,該集合是2012年4月26日的所有記錄。乘以100並將其轉換爲int可以有效地將每個值放入100個桶中的一箇中。 – user1044169 2013-04-29 03:31:06

+1

這只是與NTILE做相同的事情,只是相反。如果您希望100 *價格*子範圍具有相同的寬度,那麼您必須從範圍/規則開始以確定其總寬度並將其除以100.這是簡單的數學運算。我們需要你決定這個範圍/規則是什麼。 – RBarryYoung 2013-04-29 09:58:59

回答

3

像這樣也許:

with cte as (
    select base = 1 + u + t*3 from (
    select 0 as u union all select 1 union all select 2 
) T1 
    cross join (
    select 0 as t union all select 1 union all select 2 
) T2 
), data as (
    select * 
    from ( 
    values (1,1,2,3,3,5,7,4,2,1) 
) data(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9) 
) 
select cte.base 
    ,case when x0>=base then 'X' else ' ' end as x0 
    ,case when x1>=base then 'X' else ' ' end as x1 
    ,case when x2>=base then 'X' else ' ' end as x2 
    ,case when x3>=base then 'X' else ' ' end as x3 
    ,case when x4>=base then 'X' else ' ' end as x4 
    ,case when x5>=base then 'X' else ' ' end as x5 
    ,case when x6>=base then 'X' else ' ' end as x6 
    ,case when x7>=base then 'X' else ' ' end as x7 
    ,case when x8>=base then 'X' else ' ' end as x8 
    ,case when x9>=base then 'X' else ' ' end as x9 
from cte 
cross join data 
order by base desc 
; 

這很好地得到這個柱狀圖:

base  x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 
----------- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
9               
8               
7           X    
6           X    
5         X X    
4         X X X   
3       X X X X X   
2      X X X X X X X  
1   X X X X X X X X X X 

記住你的數據第一樞軸成一行。

對於更簡潔的演示文稿,將各種數據列連接成單個長字符串。