我有一个书籍表,其中包含主题和章节总页数和输入的页面。以下是我桌子的截图。
我根据总页数和基于主题的输入页面对此表进行解包
以下是我用于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);
如果您看到第二个屏幕截图显示橙色框中突出显示的行,则unpivot会给出重复值,例如交叉产品,并且最后输出值与原始值不匹配。前几行是 返回正确的值但是在最后和中间不是。
例如,对于主题101004,第一行的总页数必须 24 24 ,第二行的 14 14 。查询在第一行中返回 24 24 ,第二行 24 14 ,第三行 14 14 , 14 24 在第四排。
同样,主题103009需要在第一行返回 15 12 ,在第二行返回 14 4 。但是我只有一行 14 4
我尝试更改WHERE RIGHT(TotalPages,1)= RIGHT(PagesEntered,1);但是我没有得到我想要的输出。我无法找到导致此错误值的原因。
我尝试了以下链接中提供的代码,但是他们没有解决我的问题。
这是我的SQL Fiddle链接。任何帮助都非常感谢。
提前致谢
答案 0 :(得分:2)
您可以使用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,因为我没有像你这样的桌子。