2017-02-13 4 views
1

У меня есть следующая таблица.SQL: Добавить значения в расчет STDEVP

Key | Count | Amount 
----| ----- | ------ 
1 |  2 | 10 
1 |  2 | 15 
2 |  5 | 1 
2 |  5 | 2 
2 |  5 | 3 
2 |  5 | 50 
2 |  5 | 20 
3 |  3 | 5 
3 |  3 | 4 
3 |  3 | 5 

Извините, но я не мог понять, кто должен сделать вышеприведенный стол.

Я бегу это на среде SQL Server Management Студия 2012.

Я хотел бы STDEVP возврат суммы столбцов, но если количество записей меньше некоторого значения «х» (там никогда не будет более чем х записей для данного ключа), то я хочу добавить нули для учета оставшейся части.

Например, если 'х' 6:

  • для ключа 1, мне нужно STDEVP (10,5,0,0,0,0)
  • для ключа 2, мне нужно STDEVP (1,2,3,50,20,0)
  • для ключа 3, мне нужно STDEVP (5,4,5,0,0,0)

Мне просто нужно, чтобы иметь возможность добавить нулей в расчете. Я мог вставлять записи в свой стол, но это кажется довольно утомительным.

ответ

0

Это кажется сложным - заполнение данных для каждой клавиши. Вот один подход:

with xs as (
     select 0 as val, 1 as n 
     union all 
     select 0, n + 1 
     from xs 
     where xs.n < 6 
    ) 
select k.key, stdevp(coalesce(t.amount, 0)) 
from xs cross join 
    (select distinct key from t) k left join 
    (select t.*, row_number() over (partition by key order by key) as seqnum 
     from t 
    ) t 
    on t.key = k.key and t.seqnum = xs.n 
group by k.key; 

Идея заключается в том, что cross join генерирует 6 строк для каждого ключа. Затем левое соединение вводит доступные строки, вплоть до максимума.

+0

спасибо @ Gordon. Я заблуждался, надеясь, что могу просто сделать что-то вроде stdevp (количество, rep (0,6-count)), но скрестить друг с другом соединение не будет слишком сложным. очень признателен. –

+0

@spielerspieler. , , 'stdevp()' - это функция агрегирования, которая принимает значения из нескольких * строк *. Ваша интерпретация будет совсем другой функцией. –

+0

Я знаю об этом, спасибо. Я просто надеялся, что я смогу манипулировать функцией. Я использовал перекрестное присоединение к левому соединению без проблем, мне потребовалось всего пару минут, чтобы написать. Я, честно говоря, даже не знал, что перекрестное присоединение - вещь, но это имеет смысл полностью. точно так же, как expand.grid в R. Большое спасибо. –