Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按where子句中的列表分组,然后显示该行是否有值或为null_Sql_Sql Server_Join - Fatal编程技术网

Sql 按where子句中的列表分组,然后显示该行是否有值或为null

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

我在这个查询上工作了一段时间,我试图弄清楚如何让这个查询显示输出表中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.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的项目。