取消显示不正确数据和重复项的多列
Unpivoting multiple columns displaying incorrect data and duplicates
我有一本书 table,其中包含主题和章节总页数以及输入页数。下面是我的table.
的截图
我正在根据总页数和输入页数(例如下面的主题)来取消透视 table
下面是我用于 unpivot 的查询
/****** Script for SelectTopNRows command from SSMS ******/
SELECT UID
,[Subject]
,TotalPages
,PagesEntered
FROM ( SELECT UID
,[Subject]
,[Chapter1PagesEntered]
,[Chapter2PagesEentered]
,[Chapter1TotalPages]
,[Chapter2TotalPages]
FROM [dbo].[tbl_books]
) AS SRC UNPIVOT ( TotalPages FOR Cities IN ( [Chapter1TotalPages],
[Chapter2TotalPages] ) ) AS upv UNPIVOT ( PagesEntered FOR Suppliers IN ( [Chapter1PagesEntered],
[Chapter2PagesEentered] ) ) AS upv
WHERE RIGHT(TotalPages, 1) = RIGHT(PagesEntered, 1);
如果您看到第二张屏幕截图中以橙色框突出显示的行,则逆轴为我提供了类似叉积的重复值,并且最后输出值与原始值不匹配。前几行是
return 正确的值但是在最后和中间它不是。
例如,对于主题 101004,第一行的总页数必须为 24 24,第二行的总页数必须为 14 14。但是查询 returns 在第一行为 24,在第二行为 24 14,14 14 在第三行和 14 24 在第四行。
同样,Subject 103009 需要在第一行 return 15 12 和第二行 14 4 。但是我只得到一行 14 4
我尝试更改 WHERE RIGHT(TotalPages, 1) = RIGHT(PagesEntered, 1);但是我没有得到我想要的输出。我找不到导致此错误值的原因。
我尝试了下面提供的代码 link 但是它们没有解决我的问题。
Unpivoting Multiple Columns
这是我的 SQL Fiddle link。非常感谢任何帮助。
提前致谢
您可以使用 APPLY-Operator 而不是 UNPIVOT。
例如:
WITH CTE AS
(
SELECT r.* FROM (VALUES (1,'101001',16,14,16,14),
(2,'101002',16,14,16,14),
(3,'101003',16,14,16,14),
(2,'101004',24,14,24,14)) AS r(UID,Subject,Chapter1PagesEntered,Chapter2PagesEntered,Chapter1TotalPages,Chapter2TotalPages)
)
SELECT CTE.UID, A.Chapter, A.Subject, A.PagesEntered, A.TotalPages
FROM CTE
CROSS APPLY (VALUES('Chapter1',UID,Subject,Chapter1PagesEntered, Chapter1TotalPages),
('Chapter2',UID,Subject,Chapter2PagesEntered, Chapter2TotalPages)) AS A(Chapter,UID, Subject,PagesEntered,TotalPages);
我需要 CTE,因为我没有 table 像你一样。
我有一本书 table,其中包含主题和章节总页数以及输入页数。下面是我的table.
的截图我正在根据总页数和输入页数(例如下面的主题)来取消透视 table
下面是我用于 unpivot 的查询
/****** Script for SelectTopNRows command from SSMS ******/
SELECT UID
,[Subject]
,TotalPages
,PagesEntered
FROM ( SELECT UID
,[Subject]
,[Chapter1PagesEntered]
,[Chapter2PagesEentered]
,[Chapter1TotalPages]
,[Chapter2TotalPages]
FROM [dbo].[tbl_books]
) AS SRC UNPIVOT ( TotalPages FOR Cities IN ( [Chapter1TotalPages],
[Chapter2TotalPages] ) ) AS upv UNPIVOT ( PagesEntered FOR Suppliers IN ( [Chapter1PagesEntered],
[Chapter2PagesEentered] ) ) AS upv
WHERE RIGHT(TotalPages, 1) = RIGHT(PagesEntered, 1);
如果您看到第二张屏幕截图中以橙色框突出显示的行,则逆轴为我提供了类似叉积的重复值,并且最后输出值与原始值不匹配。前几行是 return 正确的值但是在最后和中间它不是。
例如,对于主题 101004,第一行的总页数必须为 24 24,第二行的总页数必须为 14 14。但是查询 returns 在第一行为 24,在第二行为 24 14,14 14 在第三行和 14 24 在第四行。
同样,Subject 103009 需要在第一行 return 15 12 和第二行 14 4 。但是我只得到一行 14 4
我尝试更改 WHERE RIGHT(TotalPages, 1) = RIGHT(PagesEntered, 1);但是我没有得到我想要的输出。我找不到导致此错误值的原因。
我尝试了下面提供的代码 link 但是它们没有解决我的问题。
Unpivoting Multiple Columns
这是我的 SQL Fiddle link。非常感谢任何帮助。
提前致谢
您可以使用 APPLY-Operator 而不是 UNPIVOT。
例如:
WITH CTE AS
(
SELECT r.* FROM (VALUES (1,'101001',16,14,16,14),
(2,'101002',16,14,16,14),
(3,'101003',16,14,16,14),
(2,'101004',24,14,24,14)) AS r(UID,Subject,Chapter1PagesEntered,Chapter2PagesEntered,Chapter1TotalPages,Chapter2TotalPages)
)
SELECT CTE.UID, A.Chapter, A.Subject, A.PagesEntered, A.TotalPages
FROM CTE
CROSS APPLY (VALUES('Chapter1',UID,Subject,Chapter1PagesEntered, Chapter1TotalPages),
('Chapter2',UID,Subject,Chapter2PagesEntered, Chapter2TotalPages)) AS A(Chapter,UID, Subject,PagesEntered,TotalPages);
我需要 CTE,因为我没有 table 像你一样。