I'm struggling with a very difficult and complicated query here and I need your help.
I have two tables as you can see below:
1) ACCOUNT1:(ATYPCODE int, ATYPDESC varchar(50), ATLASTFLAG varchar(50))
some example data of this table are:
ATYPCODE ATYPDESC ATLASTFLAG
3000 A 0
19 B 0
1170 C 0
1178 D 1
4000 AA 0
18 BB 0
2020 CC 1
Column ATLASTFLAG
shows whether this record is the last level .
Table number two is
2) ACCOUNT2:(ATYPCODE int, AGLTCODE varchar(50), AGLTLVL int)
some example data of this table are:
ATYPCODE AGLTCODE AGLTLVL
3000 3000 1
19 3000 19 2
1170 3000 191170 3
1178 3000 1911701178 4
4000 4000 1
18 4000 18 2
2020 4000 182020 3
Column ATYPCODE
is exactly the same as ATYPCODE
column in the first table.Column AGLTCODE
is bult based on the concatenation of ATYPCODE
column as you can see. The point is that the second level added to the first level with two spaces . so we have 3000+space+space+19+Other_levels
and we have to separate this column exactly with 4 characters.
and the column AGLTLVL
shows the level of each ATYPCODE
.
what we want to see as a result is this :
ATYPCODE AGLTCODE AGLTLVL ATYPCODE1 ATYPCODE2 ATYPCODE3 ATYPCODE4 ATYPDESC1 ATYPDESC2 ATYPDESC3 ATYPDESC4
and values for each column
ATYPCODE = 1178
AGLTCODE = 3000 1911701178
AGLTLVL = 4
ATYPCODE1 = 3000
ATYPCODE2 = 19
ATYPCODE3 = 1170
ATYPCODE4 = 1178
ATYPDESC1 = A
ATYPDESC2 = B
ATYPDESC3 = C
ATYPDESC4 = D
and also the next record is
ATYPCODE = 2020
AGLTCODE = 4000 182020
AGLTLVL = 3
ATYPCODE1 = 4000
ATYPCODE2 = 18
ATYPCODE3 = 2020
ATYPCODE4 = 2020(last value is repeated)
ATYPDESC1 = AA
ATYPDESC2 = BB
ATYPDESC3 = CC
ATYPDESC4 = CC(Last Values is repeated)
as you can see some records have 4 levels and some have 3 levels
since the structure of the destination table is fixed,for those with 3 levels , last value ATYPCODE3 and ATYPDESC3
should be repeated for columns ATYPCODE4 and ATYPDESC4
.
the only part of query I was able to write was this cause we only nees to store the last level and nothing comes to mind for the rest of the query
SELECT b.ATYPCODE , b.AGLTCODE , b.AGLTLVL
FROM ACCOUNT1 a inner join
ACCOUNT2 b on a.ATYPCODE = b.ATYPCODE
where a.ATLASTFLAG = 1
Best Answer
The first thing I would do is create some keys on the source tables:
Then organize the data into a useful hierarchy using a recursive query to assign group and row numbers within the structure:
The contents of the
#Data
table at this point are:Then the final query becomes much easier. We take the values from the highest row number per group for some values, and pivot the others, while adding in the type descriptions from the other table:
db<>fiddle demo