HERE is table structure with sample data provided to reproduce this issue in any PC.
CREATE TABLE [dbo].[tblCalenderDetail](
[ID] [int] IDENTITY(1,1) NOT NULL,
[MasterID] [int] NULL,
[Period] [varchar](30) NULL,
[IsDeleted] [char](1) NULL,
[IsActual] [char](1) NULL,
CONSTRAINT [PK_tblCalenderDetail] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[tblCalenderDetail] ADD CONSTRAINT [DF_tblCalenderDetail_IsDeleted] DEFAULT ('N') FOR [IsDeleted]
GO
SAMPLE DATA
insert into tblCalenderDetail(MasterID,Period,IsDeleted,IsActual)
values(1,'1Q 2017','N','N'),
(1,'2Q 2017','N','N'),
(1,'3Q 2017','N','N'),
(1,'4Q 2017','N','N'),
(1,'3Q 2017','N','N'),
(1,'2017 FY','N','N'),
(1,'1Q 2018','N','N'),
(1,'2Q 2018','N','N'),
(1,'3Q 2018','N','N'),
(1,'4Q 2018','N','N'),
(1,'2018 FY','N','N'),
(1,'1Q 2019','N','N'),
(1,'2Q 2019','N','Y'),
(1,'3Q 2019','N','N'),
(1,'4Q 2019','N','N'),
(1,'2019 FY','N','N'),
(1,'1Q 2020','N','N'),
(1,'2Q 2020','N','N'),
(1,'3Q 2020','N','N'),
(1,'4Q 2020','N','N'),
(1,'2020 FY','N','N'),
(1,'1Q 2021','N','N'),
(1,'2Q 2021','N','N'),
(1,'3Q 2021','N','N'),
(1,'4Q 2021','N','N'),
(1,'2021 FY','N','N')
my requirement is to concat A or E with Period field IsActual is set Y for 2Q 2019 and N for rest of the values.
so i need to concat A with Period values which is lower period than 2Q 2019 and also 2Q 2019 will have A
i need to concat E with Period values which is upper period than 2Q 2019. i have done this job this way but looking for better approach. please see my code which is giving right output.
DROP TABLE IF EXISTS #tmpPeriodAll
DECLARE @PeriodOrder INT
SET @PeriodOrder=0
Select Distinct A.* ,
Convert(numeric, case when A.Period like '%1Q%' then ltrim(rtrim(REPLACE(A.Period,'1Q','')))+cast( 0 as varchar)
when A.Period like '%2Q%' then ltrim(rtrim(REPLACE(A.Period,'2Q','')))+cast( 1 as varchar)
when A.Period like '%1H%' then ltrim(rtrim(REPLACE(A.Period,'1H','')))+cast( 2 as varchar)
when A.Period like '%3Q%' then ltrim(rtrim(REPLACE(A.Period,'3Q','')))+cast( 3 as varchar)
when (A.Period like '%4Q%' And A.Period not like '%53 Weeks%') then ltrim(rtrim(REPLACE(REPLACE(A.Period,'4Q',''),'53 Weeks','')))+cast( 4 as varchar)
when A.Period like '%2H%' then ltrim(rtrim(REPLACE(A.Period,'2H','')))+cast( 5 as varchar)
when (A.Period like '%4Q%' And A.Period like '%53 Week%') then ltrim(rtrim(REPLACE(REPLACE(A.Period,'4Q',''),'53 Weeks','')))+cast( 6 as varchar)
when (A.Period like '%FY%' And A.Period not like '%53 Week%') then ltrim(rtrim((REPLACE(A.Period,'FY',''))))+cast( 7 as varchar)
when A.Period like '%FY 53 Week%' then ltrim(rtrim((REPLACE(A.Period,'FY 53 Weeks',''))))+cast( 8 as varchar)
when A.Period like '%Trans Period%' then ltrim(rtrim((REPLACE(A.Period,'Trans Period',''))))+cast( 9 as varchar)
end) as PeriodOrder Into #tmpPeriodAll
FROM tblCalenderDetail A WHERE MasterID = 1 AND IsDeleted<>'Y'
--SELECT * FROM #tmpPeriodAll ORDER BY PeriodOrder
SELECT @PeriodOrder=PeriodOrder FROM #tmpPeriodAll WHERE IsActual='Y'
SELECT Period, Period+IIF(PeriodOrder<=@PeriodOrder,'A','E' ) AS NewPeriod FROM #tmpPeriodAll
ORDER BY PeriodOrder
DROP TABLE IF EXISTS #tmpPeriodAll
Another way i have achieve the task.
DROP TABLE IF EXISTS #tmpPeriodAll
DECLARE @PeriodOrder INT
SET @PeriodOrder=0
Select Distinct A.* ,
Convert(numeric, case when A.Period like '%1Q%' then ltrim(rtrim(REPLACE(A.Period,'1Q','')))+cast( 0 as varchar)
when A.Period like '%2Q%' then ltrim(rtrim(REPLACE(A.Period,'2Q','')))+cast( 1 as varchar)
when A.Period like '%1H%' then ltrim(rtrim(REPLACE(A.Period,'1H','')))+cast( 2 as varchar)
when A.Period like '%3Q%' then ltrim(rtrim(REPLACE(A.Period,'3Q','')))+cast( 3 as varchar)
when (A.Period like '%4Q%' And A.Period not like '%53 Weeks%') then ltrim(rtrim(REPLACE(REPLACE(A.Period,'4Q',''),'53 Weeks','')))+cast( 4 as varchar)
when A.Period like '%2H%' then ltrim(rtrim(REPLACE(A.Period,'2H','')))+cast( 5 as varchar)
when (A.Period like '%4Q%' And A.Period like '%53 Week%') then ltrim(rtrim(REPLACE(REPLACE(A.Period,'4Q',''),'53 Weeks','')))+cast( 6 as varchar)
when (A.Period like '%FY%' And A.Period not like '%53 Week%') then ltrim(rtrim((REPLACE(A.Period,'FY',''))))+cast( 7 as varchar)
when A.Period like '%FY 53 Week%' then ltrim(rtrim((REPLACE(A.Period,'FY 53 Weeks',''))))+cast( 8 as varchar)
when A.Period like '%Trans Period%' then ltrim(rtrim((REPLACE(A.Period,'Trans Period',''))))+cast( 9 as varchar)
end) as PeriodOrder Into #tmpPeriodAll
FROM tblCalenderDetail A WHERE MasterID = 1 AND IsDeleted<>'Y'
--SELECT * FROM #tmpPeriodAll ORDER BY PeriodOrder
--SELECT @PeriodOrder=PeriodOrder FROM #tmpPeriodAll WHERE IsActual='Y'
SELECT a.Period, a.Period+IIF(a.PeriodOrder<=cd.PeriodOrder,'A','E' ) AS NewPeriod,a.PeriodOrder
FROM #tmpPeriodAll a OUTER APPLY
(
SELECT Period,PeriodOrder FROM #tmpPeriodAll WHERE IsActual='Y'
) cd
ORDER BY a.PeriodOrder
DROP TABLE IF EXISTS #tmpPeriodAll
THANKS