取消显示不正确数据和重复项的多列

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 1414 14 在第三行和 14 24 在第四行。

同样,Subject 103009 需要在第一行 return 15 12 和第二行 14 4 。但是我只得到一行 14 4

我尝试更改 WHERE RIGHT(TotalPages, 1) = RIGHT(PagesEntered, 1);但是我没有得到我想要的输出。我找不到导致此错误值的原因。

我尝试了下面提供的代码 link 但是它们没有解决我的问题。

Unpivoting Multiple Columns

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 像你一样。