Как разбить данные q1 на месяцы - PullRequest
0 голосов
/ 11 сентября 2018

Привет У меня есть одно сомнение в SQL Server:

в моей таблице есть 4 значения, относящиеся к Querter доступны.здесь я хочу разделить значения суммы q1 на месяцы (апрель, май, июнь) текущего года и значения суммы q2 на месяцы (июль, август, сентябрь) текущего года значения суммы q3 на месяцы (октябрь, ноябрь, декабрь) текущего годаq4 сумма значений в месяцах (январь, февраль, март) текущего года, если я запускаю текущие месяцы (январь или февраль или март), то рассматриваю год как текущий год, за исключением следующего года текущего года.

таблица:

CREATE TABLE [dbo].[task](
    [Vertical] [varchar](50) NULL,
    [AccountName] [varchar](50) NULL,
    [q1] [money] NULL,
    [q2] [money] NULL,
    [q3] [money] NULL,
    [q4] [money] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[task] ([Vertical], [AccountName], [q1], [q2], [q3], [q4]) VALUES (N'BFSI', N'susse', 90.0000, 15.0000, 30.0000, 6.0000)
GO
INSERT [dbo].[task] ([Vertical], [AccountName], [q1], [q2], [q3], [q4]) VALUES (N'BFSI', N'AIG', 100.0000, 50.0000, 40.0000, 60.0000)
GO

на основе приведенных выше данных, которые я хочу вывести, как показано ниже:

+----------+-------------+---------+-----------+------+
| vertical | accountname | reveune |   month   | year |
+----------+-------------+---------+-----------+------+
| BFSI     | AIG         | 13.3333 | December  | 2018 |
| BFSI     | AIG         | 13.3333 | November  | 2018 |
| BFSI     | AIG         | 13.3333 | October   | 2018 |
| BFSI     | AIG         | 16.6666 | August    | 2018 |
| BFSI     | AIG         | 16.6666 | July      | 2018 |
| BFSI     | AIG         | 16.6666 | September | 2018 |
| BFSI     | AIG         |   20.00 | Feburary  | 2019 |
| BFSI     | AIG         |   20.00 | January   | 2019 |
| BFSI     | AIG         |   20.00 | March     | 2019 |
| BFSI     | AIG         | 33.3333 | April     | 2018 |
| BFSI     | AIG         | 33.3333 | June      | 2018 |
| BFSI     | AIG         | 33.3333 | May       | 2018 |
| BFSI     | susse       |    2.00 | Feburary  | 2019 |
| BFSI     | susse       |    2.00 | January   | 2019 |
| BFSI     | susse       |    2.00 | March     | 2019 |
| BFSI     | susse       |    5.00 | August    | 2018 |
| BFSI     | susse       |    5.00 | July      | 2018 |
| BFSI     | susse       |    5.00 | September | 2018 |
| BFSI     | susse       |   10.00 | December  | 2018 |
| BFSI     | susse       |   10.00 | November  | 2018 |
| BFSI     | susse       |   10.00 | October   | 2018 |
| BFSI     | susse       |   30.00 | April     | 2018 |
| BFSI     | susse       |   30.00 | June      | 2018 |
| BFSI     | susse       |   30.00 | May       | 2018 |
+----------+-------------+---------+-----------+------+

Я пробовал, как показано ниже:

select  vertical ,accountname ,[q1]/3  as reveune , 'April' as month  ,year(getdate())as year from task 
union 
select  vertical ,accountname ,[q1]/3 revenue ,'May' as month,  year(getdate())as year from task 
union
select  vertical ,accountname ,[q1]/3  as reveune , 'June' as month  ,year(getdate())as year from task 
union 
select  vertical ,accountname ,[q2]/3 revenue ,'July' as month,  year(getdate())as year from task 
union
select  vertical ,accountname ,[q2]/3 revenue ,'August' as month,  year(getdate())as year from task 
union
select  vertical ,accountname ,[q2]/3 revenue ,'September' as month,  year(getdate())as year from task 
union 
select  vertical ,accountname ,[q3]/3 revenue ,'October' as month,  year(getdate())as year from task 
union
select  vertical ,accountname ,[q3]/3 revenue ,'November' as month,  year(getdate())as year from task 
union
select  vertical ,accountname ,[q3]/3 revenue ,'December' as month,  year(getdate())as year from task 
union
select  vertical ,accountname ,[q4]/3 revenue ,'January' as month,  
case when datepart(mm,getdate())=1 then datepart(yyyy,getdate()) else  datepart(yyyy,getdate())+1 end  year from task
union 
select  vertical ,accountname ,[q4]/3 revenue ,'Feburary' as month,  
case when datepart(mm,getdate())=1 then datepart(yyyy,getdate()) else  datepart(yyyy,getdate())+1 end  year from task 
union 
select  vertical ,accountname ,[q4]/3 revenue ,'March' as month,  
case when datepart(mm,getdate())=1 then datepart(yyyy,getdate()) else  datepart(yyyy,getdate())+1 end  year from task 

запрос выше дает ожидаемыйРезультат. Но это занимает очень много времени. Можете ли вы сказать мне любое альтернативное решение для решения этой задачи в SQL Server

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете попытаться создать желаемый результат с помощью cross apply:

select Vertical, AccountName, x.v as revenue, x.m as month, x.y as year
from [dbo].[task]
cross apply (values 
     (q1/3, 'April'    , year(getdate()))
    ,(q1/3, 'May'      , year(getdate()))
    ,(q1/3, 'June'     , year(getdate()))
    ,(q2/3, 'July'     , year(getdate()))
    ,(q2/3, 'August'   , year(getdate()))
    ,(q2/3, 'September', year(getdate()))
    ,(q3/3, 'October'  , year(getdate()))
    ,(q3/3, 'November' , year(getdate()))
    ,(q3/3, 'December' , year(getdate()))
    ,(q4/3, 'January'  , case when datepart(mm,getdate())=1 then datepart(yyyy,getdate()) else  datepart(yyyy,getdate())+1 end) 
    ,(q4/3, 'February' , case when datepart(mm,getdate())=1 then datepart(yyyy,getdate()) else  datepart(yyyy,getdate())+1 end) 
    ,(q4/3, 'March'    , case when datepart(mm,getdate())=1 then datepart(yyyy,getdate()) else  datepart(yyyy,getdate())+1 end) 
    ) x(v,m,y)

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

...