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

为什么我在SQL查询中得到空值?,sql,null,pivot,pivot-table,Sql,Null,Pivot,Pivot Table,伙计们,我正试图在SQL查询中使用PIVOT,它与WHERE子句配合得很好,但是如果我从SQL语句中删除WHERE子句,结果将为空。我似乎不明白为什么我会得到空值,因为我的表中根本没有空值。 我只想显示生成的所有票据 SQL查询(带WHERE子句) 参考图片: SQL查询(不带WHERE子句-显示空值) 参考图片: 准确地说出发生了什么是很困难的(您可以使用的一种有用的调试技术是注释掉部分查询,例如透视,并执行选择*,以了解前后数据),但我想您可能需要为每个单独的票据指定单独的行号。在这种情况

伙计们,我正试图在SQL查询中使用
PIVOT
,它与
WHERE
子句配合得很好,但是如果我从SQL语句中删除
WHERE
子句,结果将为空。我似乎不明白为什么我会得到空值,因为我的表中根本没有空值。 我只想显示生成的所有票据

SQL查询(带WHERE子句)

参考图片:

SQL查询(不带WHERE子句-显示空值)

参考图片:


准确地说出发生了什么是很困难的(您可以使用的一种有用的调试技术是注释掉部分查询,例如
透视
,并执行
选择*
,以了解前后数据),但我想您可能需要为每个单独的票据指定单独的行号。在这种情况下,您希望在
行编号()中按
分区
调用:

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

它来自于您的ROW_NUMBER(),得到一个不同的结果集来处理。ROW_NUMBER()OVER是一个窗口函数,因此它将根据查询结果计算行号,并且当您的WHERE进行不同的查询时,您将得到不同的ROW_NUMBER().@AllanS.Hansen我明白了,如果我想显示所有票证,我该怎么办?可能是一个分区,根据下面的答案-取决于您想要实现的目标。先做选择,给出正确的实际结果,然后做第二个选择。@AllanS.Hansen感谢您抽出时间回答我的问题<代码>按分区
是我所需要的全部。
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
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