使用sql server对两个表进行数据透视
在我的数据库中有两个表,分别名为Topic和solion 我的桌子如下所示 主题表: 第二桌 这两张是我的桌子,我想像下面一样旋转这两张桌子 皮维奥特表使用sql server对两个表进行数据透视,sql,sql-server,Sql,Sql Server,在我的数据库中有两个表,分别名为Topic和solion 我的桌子如下所示 主题表: 第二桌 这两张是我的桌子,我想像下面一样旋转这两张桌子 皮维奥特表 请帮助…因为这里没有逻辑,我创建了自己的:D只是有兴趣将其自动化 我的逻辑是,我将解决方案中的第一个主题“A”放在4行,第二个主题“B”放在3行,第三个主题“A”放在4行,以此类推。将溶液分成4行和3行批次 请查看示例中的注释: ----------- --created some data to test ----------- DECLAR
请帮助…因为这里没有逻辑,我创建了自己的:D只是有兴趣将其自动化 我的逻辑是,我将解决方案中的第一个主题“A”放在4行,第二个主题“B”放在3行,第三个主题“A”放在4行,以此类推。将溶液分成4行和3行批次 请查看示例中的注释:
-----------
--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
*/
我想这不是请求的内容,但很有趣地找到了一些解决方案:D我想连接这两个表,并像透视表一样获得结果。这里我想将主题列值作为透视表中的列。如何连接?是交叉连接吗?但即使是这样,您的预期结果也不像交叉连接。你能回答这个问题吗:为什么EE在B之下而不是在A之下?为什么B有三个值,C有四个值?回答这些问题可能会让我们了解您想要的内容。我想在我的前端的excel工作表中使用此数据透视表进行相关下拉。@jyparask我认为OP遗漏了预期结果中的II和PPAre A、B、C和D列名,或者它们是结果的一部分?
Solution
AA
BB
CC
DD
EE
FF
GG
HH
II
JJ
KK
LL
MM
NN
OO
PP
A B C D
AA EE HH MM
BB FF JJ NN
CC GG KK OO
DD LL
-----------
--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
*/