2016-07-07 1 views
1

У меня есть эти столбцы в table1:Как добавить фиктивный месяц (SQL запрос)

enter image description here

Теперь мне нужно добавить фиктивный месяц. Как быстро написать SQL-запрос, который разделяет Q1 (как одну строку) на 3 месяца?

Результат должен быть таким:

enter image description here

Возможно ли это?

EDIT 1:

Вот это SQL заявление, которое производит первую таблицу

select year, time, q, th, l1, l2, par, par2, sum(value) 
from table1 
group by year, time, q, th, l1, l2, par, par2 
+0

у вас есть оператор SQL, которые производят первую таблицу? – ddb

+0

выбрать год, время, q, th, l1, l2, par, par2, sum (value) из таблицы1 group by year, time, q, th, l1, l2, par, par2 – 4est

+0

Вы можете совместно использовать схему таблицы ? – ddb

ответ

1

Используйте convert повернуть Q1, Q2, Q3, Q4 в качестве исходного числа месяца; затем используйте union для тиражирования строки три раза (деление суммы на три).

select year, time, q, 
    month = convert(int, right(q,1))*3 - 2, 
    th, l1, l2, par, par2, sum(value)/3 
from table1 group by year, time, q, th, l1, l2, par, par2 
union all 
select year, time, q, 
    month = convert(int, right(q,1))*3 - 1, 
    th, l1, l2, par, par2, sum(value)/3 
from table1 group by year, time, q, th, l1, l2, par, par2 
union all 
select year, time, q, 
    month = convert(int, right(q,1))*3, 
    th, l1, l2, par, par2, sum(value)/3 
from table1 group by year, time, q, th, l1, l2, par, par2 
+0

спасибо Росс, отлично работает! – 4est

3

Попробуйте этот подход, используя CROSS JOIN и ROW_NUMBER().

CROSS JOIN с динамической таблицей (таблица2), которая имеет 3 записи, будет выводить 3 строки за каждый квартал в основной таблице, а затем использовать функцию ROW_NUMBER(), чтобы получить номер месяца для каждого года по четверти.

Ниже приведен пример.

--Add some sample data to represent your table1 
DECLARE @table1 TABLE ([Year] int, Q varchar(10)) 

INSERT INTO @table1 ([Year], Q) 
VALUES (2016, 'Q1'), 
     (2016, 'Q2'), 
     (2016, 'Q3'), 
     (2016, 'Q4') 

--Query 
SELECT [year], Q, 
     ROW_NUMBER() OVER (PARTITION BY [Year] ORDER BY qtr) [Month] 
FROM @Table1 t1 
     CROSS JOIN (SELECT qtr FROM (VALUES(1),(2),(3)) Table2 (qtr)) t2 
0

Это не то, о чем вы просите, но вы можете иметь представление о том, как его можно принять в вашем случае. Я использовал переменную таблицы, которую вы должны заменить ее именем таблицы. Я сделал некоторые вставки только для целей тестирования:

declare @table table (Q varchar(10),amount decimal(18,2)) 
insert into @table values ('Q1',80000),('Q2',500000),('Q3',457000),('Q4',75000) 
declare @table2 table (Q varchar(10),muaji int) 
insert into @table2 values ('Q1',1),('Q1',2),('Q1',3),('Q2',4),('Q2',5),('Q2',6),('Q3',7),('Q3',8),('Q3',9),('Q4',10),('Q4',11),('Q4',12) 
select t1.Q,t2.muaji,t1.amount/3 from @table t1 inner join @table2 t2 on t1.Q=t2.Q 
0

Это должно работать:

declare @t table (id int identity(1,1),q char(2)) 
insert into @t 
select 'q1' 
union all select 'q1' 
union all select 'q2' 
union all select 'q2' 
union all select 'q2' 
union all select 'q1' 
union all select 'q4' 
union all select 'q3' 
union all select 'q3' 
union all select 'q4' 
union all select 'q4' 
union all select 'q3' 

--select * from @t 
select mn = ROW_NUMBER() OVER(ORDER BY q) ,q 
from @t 
Смежные вопросы