伙计我正在尝试在SQL查询中使用PIVOT
,并且它与WHERE
子句配合使用,但如果从SQL语句中删除WHERE
子句,结果会得到空值。我似乎无法理解为什么我得到空值,因为我的表中根本没有空值。
我只想显示所有生成的门票。
SQL查询(使用WHERE子句)
--TD
CREATE TABLE tblTicketDetail
(
TicketID INT,
IssuerName NVARCHAR(30),
TicketDescription NVARCHAR(30)
)
--EN
CREATE TABLE tblEngineer
(
EngineerID INT IDENTITY(1,1),
[Name] NVARCHAR(30)
)
--TE
CREATE TABLE tblTicket_Engineer
(
TicketID INT,
EngineerID INT
)
INSERT INTO tblTicketDetail (TicketID, IssuerName, TicketDescription)
VALUES(1, 'Saqib', 'qwerty keyboard')
INSERT INTO tblEngineer ([Name])
VALUES('Imran Khan'), ('Mubeen Khan'), ('Faraz Ahmed')
INSERT INTO tblTicket_Engineer (TicketID, EngineerID)
VALUES(1,1),(1,2),(1,3)
SELECT TicketID, IssuerName, TicketDescription, [1], [2], [3]
FROM (
SELECT TD.TicketID, TD.IssuerName, TD.TicketDescription, ROW_NUMBER() OVER(ORDER BY TE.EngineerID) AS EngineerNo, EN.[Name]
FROM tblTicketDetail AS TD
INNER JOIN tblTicket_Engineer AS TE ON TD.TicketID = TE.TicketID
INNER JOIN tblEngineer AS EN ON TE.EngineerID = EN.EngineerID
WHERE (TE.TicketID = 1)
) AS DT
PIVOT(MAX([Name]) FOR [EngineerNo] IN([1], [2], [3])) AS PT
DROP TABLE tblTicketDetail
DROP TABLE tblEngineer
DROP TABLE tblTicket_Engineer
参考图片:
SQL查询(没有WHERE子句 - 显示空值)
SELECT TicketID, IssuerName, TicketDescription, [1], [2], [3]
FROM (
SELECT TD.TicketID, TD.IssuerName, TD.TicketDescription, ROW_NUMBER() OVER(ORDER BY TE.EngineerID) AS EngineerNo, EN.[Name]
FROM tblTicketDetail AS TD
INNER JOIN tblTicket_Engineer AS TE ON TD.TicketID = TE.TicketID
INNER JOIN tblEngineer AS EN ON TE.EngineerID = EN.EngineerID
) AS DT
PIVOT(MAX([Name]) FOR [EngineerNo] IN([1], [2], [3])) AS PT
图片供参考:
答案 0 :(得分:1)
确切地说出正在发生的事情是很棘手的(您可以使用的一种有用的调试技术是注释掉部分查询,例如PIVOT
和SELECT *
以了解在数据之前和之后),但我认为您可能希望每个单独的票证都有单独的行号。在这种情况下,您需要在PARTITION BY
电话中ROW_NUMBER()
:
SELECT TicketID, IssuerName, TicketDescription, [1], [2], [3]
FROM (
SELECT TD.TicketID, TD.IssuerName, TD.TicketDescription,
ROW_NUMBER() OVER(
PARTITION BY TD.TicketID
ORDER BY TE.EngineerID) AS EngineerNo,
EN.[Name]
FROM tblTicketDetail AS TD
INNER JOIN tblTicket_Engineer AS TE ON TD.TicketID = TE.TicketID
INNER JOIN tblEngineer AS EN ON TE.EngineerID = EN.EngineerID
) AS DT
PIVOT(MAX([Name]) FOR [EngineerNo] IN([1], [2], [3])) AS PT