2013-06-13 5 views
1

У меня есть следующая структура таблицы с около 3mn точками данных в базе данных MSSQL 2008 R2.Quartile for Boxplot :: MSSQL 2008 R2

vertical|Defects(F)|Defects(NF)| 
-------------------------------- 
Billing |193  |678 
Provi |200  |906 
Billing |232  |111 
Analyt |67  |0 
Provi |121  |690 

Мне нужно вычислить Мин, Макс, первый квартиль и третью квартиль нарисовать усы сюжета. Поэтому хотелось бы выход в следующем формате

vertical|Max  |Min  |Q1  |Q3 
-------------------------------- 
Billing |343  |24  |103.75 |263.25 
Provi |811  |110  |285.25 |635.75 
Analyt |67  |67  |67  |67 

Пожалуйста, обратите внимание, что Макс, Мин и квартиль вычисления выполняются после добавления дефектов (F) и дефектах (NF)

Пожалуйста, помогите !!

+0

Есть некоторые функции, которые могут делать то, что вы хотите, например, NTILE http://msdn.microsoft.com/en-us/library/ms175126(v=sql.90).aspx –

+0

@youbarajsharma: У вас есть поле даты в Таблица ? Можете ли вы предоставить образец ввода? И что ты пробовал? –

ответ

1

Этот метод работает только если у нас есть много строк каждого типа

q1min является минимум 1-й квартал (Overal мин)

q2min является минимум 2-й квартал (первая квартиль)

q3max является максимум 3-й квартал (третий квартиль)

q4max является максимум 4-й квартал (Overal макс)

declare @my_table table (vertical varchar(50),[Defects(F)] int, [Defects(NF)] int); 
insert into @my_table values ('Billing',193,678); 
insert into @my_table values ('Provi',200,906); 
insert into @my_table values ('Billing',232,111); 
insert into @my_table values ('Analyt',67,0); 
insert into @my_table values ('Provi',121,690); 

insert into @my_table values ('Billing',111,678); 
insert into @my_table values ('Billing',111,678); 
insert into @my_table values ('Billing',111,678); 
insert into @my_table values ('Billing',111,678); 
insert into @my_table values ('Billing',111,678); 
insert into @my_table values ('Billing',111,678); 
insert into @my_table values ('Billing',111,678); 

WITH cte as (
    select 
     vertical, 
     [Defects(F)]+[Defects(NF)] as defects 
    from @my_table 
), 
PivotData AS 
(
    select 
     vertical, 
     CASE WHEN quartile in (1,2) THEN MIN(defects) ELSE MAX(defects) END m, 
     quartile 
    from (
     select 
      vertical, 
      defects, 
      ntile(4) over (PARTITION BY vertical order by defects) as quartile 
     from cte 
    ) i 
    group by vertical, quartile 
) 
select vertical, [1] as q1min, [2] as q2min, [3] as q3max, [4] as q4max 
FROM PivotData 
PIVOT (SUM(m) FOR quartile in ([1],[2],[3],[4])) as p; 
+0

Большое спасибо Alex, ваше предложение действительно работало –