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