如何使用SQL查询省略空值

时间:2015-10-03 19:44:27

标签: sql sql-server

我试图只显示研究人员有日期的行。 我无法使用Null值省略行。我甚至试过这个解决方案How to remove null rows from sql query result? ..

这是我的查询:

SELECT Submission.Title AS [Submission_Title], CA.Surname AS [Researchers], Submission.Status AS [Status] 
FROM Submission 
CROSS APPLY (SELECT STUFF((SELECT DISTINCT ', ' + r.Surname 
FROM ResearcherSubmission rs INNER JOIN Researcher r 
ON r.ResearcherID = rs.ResearcherID 
WHERE CONCAT (DATENAME(MONTH,[Submission].[SubmissionDate]), ' ',DATEPART (YEAR,[Submission].[SubmissionDate])) = 'October 2015'  
AND Submission.SubmissionID = rs.SubmissionID 
FOR XML PATH (''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ')) AS CA (Surname) 
GROUP BY convert(varchar(10),datename(month,Submission.SubmissionDate)), Submission.Title, CA.Surname, Submission.Status;

这是我当前的输出:

enter image description here

任何建议。谢谢

2 个答案:

答案 0 :(得分:2)

Quickfix,无需阅读查询:

WITH cte AS
(
SELECT Submission.Title AS [Submission_Title], CA.Surname AS [Researchers], Submission.Status AS [Status] 
FROM Submission 
CROSS APPLY (SELECT STUFF((SELECT DISTINCT ', ' + r.Surname 
FROM ResearcherSubmission rs INNER JOIN Researcher r 
ON r.ResearcherID = rs.ResearcherID 
WHERE CONCAT (DATENAME(MONTH,[Submission].[SubmissionDate]), ' ',DATEPART (YEAR,[Submission].[SubmissionDate])) = 'October 2015'  
AND Submission.SubmissionID = rs.SubmissionID 
FOR XML PATH (''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ')) AS CA (Surname) 
GROUP BY convert(varchar(10),datename(month,Submission.SubmissionDate)), Submission.Title, CA.Surname, Submission.Status
)
SELECT *
FROM cte
WHERE Researchers IS NOT NULL;

可能有更优雅的解决方案,但您需要共享样本数据和结构。

这部分可能会导致问题:

SELECT DISTINCT ', ' + r.Surname

尝试使用CONCAT或:

SELECT DISTINCT ', ' + ISNULL(r.Surname, '')

答案 1 :(得分:1)

你应该在group by之前而不是之后过滤掉研究人员。如果可能,在聚合之前放置条件会更好(性能方面)。

SELECT s.Title AS Submission_Title, CA.Surname AS Researchers, s.Status 
FROM Submission s CROSS APPLY
     (SELECT STUFF((SELECT DISTINCT ', ' + r.Surname 
                    FROM ResearcherSubmission rs INNER JOIN
                         Researcher r 
                         ON r.ResearcherID = rs.ResearcherID 
                    WHERE s.SubmissionID = rs.SubmissionID 
                    FOR XML PATH (''), TYPE).value('.', 'NVARCHAR(MAX)'
                   ), 1, 2, ' '))
    ) AS CA(Surname) 
WHERE s.SubmissionDate >= '2015-10-01' AND s.SubmissionDate < '2015-11-01' AND
      ca.Surname IS NULL
GROUP BY YEAR(s.SubmissionDate), MONTH(s.SubmissionDate), s.Title, CA.Surname, s.Status;

请注意所做的更改:

  • 表别名使查询更易于编写和阅读。
  • 我将日期比较更改为日期本身没有任何功能。这将允许SQL Server使用索引(如果适用)。
  • 我还将日期比较从CROSS APPLY子查询移到了外部查询。这可能是效率的重大提升。为什么要对过滤掉的行进行额外的工作呢?
  • 我将NOT NULL条件添加到WHERE子句。
  • 外部GROUP BY中的日期键是多余的,因为查询仅使用一个月的数据。我简化了逻辑,但离开了它。