2016-12-16 6 views
0

Я хочу разделить одну строку на 4 строки с использованием SQL-скрипта. Это то, что я получаю в SQL Result год, квартал, месяц и x достойное значение. Теперь я также хотел бы провести неделю месяца (1-4), не добавляя это как столбец таблицы. Аналогично, значение должно быть разделено на четыре. Таким образом, из этого результата:Postgresql: разделите строку на 4 строки.

year | quarter | month | value 
2016 | 1  | 1  | 78954 

Этот результат:

year | quarter | month | week | value 
2016 | 1  | 1  | 1 | 19738,5 
2016 | 1  | 1  | 2 | 19738,5 
2016 | 1  | 1  | 3 | 19738,5 
2016 | 1  | 1  | 4 | 19738,5 

Я понятия не имею, как я мог бы осуществить это. Надеюсь, кто-нибудь может мне помочь.

С наилучшими пожеланиями

+2

Есть более недели в течение одного месяца, то 4 –

+0

Но как я могу проверить это в @VaoTsun SQL запроса? – Lars

+0

хорошо, если вам небезразличны недели, вы, вероятно, должны использовать wook года, например 'select extract (week from now());' даст вам 50. Он не решает проблему, что 52-я неделя текущего года - первая неделя следующий. Но, по крайней мере, приближение в 10 раз лучше. В любом случае, если вам все равно, вы должны подумать еще об одном вопросе - на этот раз блестяще ответил Сами. –

ответ

2

Вы можете сделать это с декартовой присоединиться:

SELECT a.year, a.quarter, a.month, b.week, a.value 
    FROM a, (SELECT UNNEST(ARRAY[1, 2, 3, 4]) as week) b 
+0

Вы забыли разделить 'a.value' на' 4.0' – pozs

+0

@pozs, что не так уж плохо – Lars

0

Просто используйте union:

select year, quarter, month, 1 as week, value/4 as value 
union all 
select year, quarter, month, 2 as week, value/4 as value 
union all 
select year, quarter, month, 3 as week, value/4 as value 
union all 
select year, quarter, month, 4 as week, value/4 as value 
0

Вы также можете использовать `generate_series() для этого:

select t.year, t.quarter, t.month, w.week, t.value/4 
from the_table t 
cross join generate_series(1,4) as w(week) 
order by t.year, t.quarter, w.week; 

Использование generate_series() является более гибким, если вам нужно изменить количество повторяющихся строк, которые вам нужны, хотя «неделя за квартал» на самом деле не нуждается в такой гибкости.

0

Или вы можете сделать это в очень научно ищет способ :-)

WITH series as (select generate_series(1,4,1) as week), 
    data as (SELECT 2016 as year, 1 as quarter, 1 as month, 78954 as value) 
    SELECT d.year, d.quarter, d.month, s.week, d.value/(SELECT count(*) FROM series)::numeric 
    FROM data d JOIN series s ON true 
Смежные вопросы