为什么我在SQL查询中得到空值?

时间:2014-03-31 06:09:36

标签: sql null pivot pivot-table

伙计我正在尝试在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

参考图片:

enter image description here

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

图片供参考:

enter image description here

1 个答案:

答案 0 :(得分:1)

确切地说出正在发生的事情是很棘手的(您可以使用的一种有用的调试技术是注释掉部分查询,例如PIVOTSELECT *以了解在数据之前和之后),但我认为您可能希望每个单独的票证都有单独的行号。在这种情况下,您需要在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