user3643469
user3643469

Reputation: 15

Pivoting for two tables using sql server

Here i am having two tables in my database with names Topic and Soltion.

My tables are looks like below.

Topic Table:

Topic

A
B
C
D

Second table

Solution

AA
BB
CC
DD
EE
FF
GG
HH
II
JJ
KK
LL
MM
NN
OO
PP

These two are my tables here i wants to pivot these two table like below

Piviot table

A             B         C         D

AA            EE         HH       MM

BB            FF         JJ       NN

CC            GG         KK       OO

DD                       LL

Please help...

Upvotes: 0

Views: 145

Answers (1)

Darka
Darka

Reputation: 2768

So as there is no logic here, I created my own :D (just was interested to automate this).

My logic is that, I put to first topic 'A' 4 rows from Solution, for second 'B' next 3 rows, for third 4 rows and so on. Split Solution in 4 and 3 rows batches.

Please look at comments inside example:

-----------
--created some data to test
-----------
DECLARE @Topic TABLE (topic CHAR(1))

INSERT INTO @Topic SELECT 'A'
INSERT INTO @Topic SELECT 'B'
INSERT INTO @Topic SELECT 'C'
INSERT INTO @Topic SELECT 'D'

DECLARE @Solution TABLE (solution CHAR(2))

INSERT INTO @Solution SELECT 'AA'
INSERT INTO @Solution SELECT 'BB'
INSERT INTO @Solution SELECT 'CC'
INSERT INTO @Solution SELECT 'DD'
INSERT INTO @Solution SELECT 'EE'
INSERT INTO @Solution SELECT 'FF'
INSERT INTO @Solution SELECT 'GG'
INSERT INTO @Solution SELECT 'HH'
INSERT INTO @Solution SELECT 'II'
INSERT INTO @Solution SELECT 'JJ'
INSERT INTO @Solution SELECT 'KK'
INSERT INTO @Solution SELECT 'LL'
INSERT INTO @Solution SELECT 'MM'
INSERT INTO @Solution SELECT 'NN'
INSERT INTO @Solution SELECT 'OO'
INSERT INTO @Solution SELECT 'PP'


--DROP TABLE #topicCTE

-----------
--created table which shows what IDs from solution table must get topic
-----------
;WITH topicCTE As (
    SELECT topic, ROW_NUMBER() OVER (ORDER BY topic) AS ID
    FROM @Topic
)
SELECT topic, ID
    , CASE WHEN ID % 2 = 1 THEN (((ID / 2)+1) *4 + (ID / 2) *3)-4 ELSE (((ID / 2)) *4 + (ID / 2) *3)-3 END AS RowsMINID
    , CASE WHEN ID % 2 = 1 THEN (((ID / 2)+1) *4 + (ID / 2) *3) ELSE (((ID / 2)) *4 + (ID / 2) *3) END AS RowsMAXID
INTO #topicCTE
FROM topicCTE

/*Example Result
topic   ID  RowsMINID   RowsMAXID
A       1   0           4
B       2   4           7
C       3   7           11
D       4   11          14
*/

--DROP TABLE #FinalData
-----------
--attached topics to solution
-----------  

;WITH SolutionCTE AS (
SELECT Solution, ROW_NUMBER() OVER (ORDER BY Solution) AS ID
FROM @Solution 
)
SELECT S.Solution, T2.Topic, ROW_NUMBER() OVER (PARTITION BY T2.Topic ORDER BY Solution) AS RowsID
INTO #FinalData
FROM SolutionCTE AS S
CROSS APPLY (
            SELECT * 
            FROM #topicCTE AS T
            WHERE T.RowsMINID < S.ID AND T.RowsMAXID >= S.ID
           ) AS T2

/*Example result
Solution    Topic   RowsID
AA          A       1
BB          A       2
CC          A       3
DD          A       4
EE          B       1
FF          B       2
GG          B       3
*/



-----------
--get columns for pivot from @topic table
-----------
DECLARE @columns VARCHAR(1000) = STUFF((SELECT ',[' + topic + ']' FROM @Topic FOR XML PATH('')), 1, 1, '')

-----------
--create pivot sql command
-----------
DECLARE @sql NVARCHAR(MAX) = N'
SELECT ' + @columns + '
FROM #FinalData
PIVOT
(
    MAX(Solution)
    FOR [Topic] IN (' + @columns + ')
) AS p';

EXECUTE sp_executesql @sql

/*FINAL Results
A   B   C   D
AA  EE  HH  LL
BB  FF  II  MM
CC  GG  JJ  NN
DD      KK  

*/

I guess this is not what request is, but was fun to fine some solution :D

Upvotes: 1

Related Questions