Sql 按where子句中的列表分组,然后显示该行是否有值或为null
我在这个查询上工作了一段时间,我试图弄清楚如何让这个查询显示输出表中where子句中的所有首字母,而不管此人是否有p.Id。这是因为我将把这些信息放入一个预先格式化的Excel表格中。提前谢谢!编辑:Sql 按where子句中的列表分组,然后显示该行是否有值或为null,sql,sql-server,join,Sql,Sql Server,Join,我在这个查询上工作了一段时间,我试图弄清楚如何让这个查询显示输出表中where子句中的所有首字母,而不管此人是否有p.Id。这是因为我将把这些信息放入一个预先格式化的Excel表格中。提前谢谢!编辑: SELECT e.Initials, COUNT(p.Id) As "NT > 7" FROM Employees AS e LEFT JOIN Projects AS p ON e.Id = p.NTEmployeeId AND cast(p
SELECT
e.Initials, COUNT(p.Id) As "NT > 7"
FROM
Employees AS e
LEFT JOIN
Projects AS p
ON
e.Id = p.NTEmployeeId AND
cast(p.NTDate as Datetime) < cast(dateadd(day, -7, (getdate())) as Datetime)
JOIN
Statuses AS s
ON
s.Id = p.StatusId AND
s.Code in ('WIPR', 'RISK', 'PEND')
WHERE
e.Initials IN('af', 'cm' , 'jy','br','dfv','rxc','tm','axk','hd','sa','rw')
GROUP BY (e.Initials);
您需要额外的左联接,并将除第一个表外的所有表上的条件移动到on子句中。记住,where子句会将外部联接转换为内部联接,因为NULL值通常不匹配条件
SELECT e.Initials, COUNT(p.Id) As "NT > 7"
FROM Employees e LEFT JOIN
Projects p
ON e.Id = p.NTEmployeeId AND
cast(p.NTDate as Date) < cast(getdate() as date) -- do date comparisons as dates, not strings
LEFT JOIN -- NEED LEFT JOIN HERE, or `ON` clause turns it into inner join
Statuses s
ON s.Id = p.StatusId AND
s.Code in ('WIPR', 'RISK', 'PEND') -- `LIKE`/`OR` isn't wrong but `IN` is easier
WHERE e.Initials IN ('af', 'cm' , 'jy', 'br','dfv', 'rxc', 'tm', 'axk', 'hd', 'sa', 'rw')
GROUP BY e.Initials;
我做了一些其他的改变:
使用日期来比较日期,而不是字符串。我想我的逻辑是正确的。
如果可以的话,用IN代替or链。
对于您正在做的事情,您可能希望统计匹配的状态,而不是匹配的人。
我弄明白了我需要做什么才能得到正确的答案。请参阅下文:
SELECT
e.Initials, COUNT(CASE WHEN s.Code in ('WIPR', 'RISK', 'PEND')
and cast(p.NTDate as Datetime) < cast(dateadd(day, -7, (getdate())) as Datetime) THEN p.Id END) As "NT > 7"
FROM
Employees AS e
LEFT JOIN
Projects AS p
ON
e.Id = p.NTEmployeeId
JOIN
Statuses AS s
ON
s.Id = p.StatusId
WHERE
e.Initials IN('af', 'cm' , 'jy','br','dfv','rxc','tm','axk','hxd','rw')
GROUP BY (e.Initials);
感谢@Gordon Linoff的支持!我尝试了这个方法,虽然这些更改确实显示了列出的所有首字母,但如果我使用左a连接而不是内部连接,p.ID的计数将远远超过正确的数字。如果我将其保留为一个内部联接,我将获得NT天数大于7天的正确项目数,但是我无法看到所有的首字母,只有那些具有满足指定条件的p.id的项目。