Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server 用于计算每日人口普查的SQL Server查询_Sql Server - Fatal编程技术网

Sql server 用于计算每日人口普查的SQL Server查询

Sql server 用于计算每日人口普查的SQL Server查询,sql-server,Sql Server,我对填充医院单位当前住院患者每日普查的查询有问题。是我找到查询的地方 SELECT [date], COUNT (DISTINCT CASE WHEN admit_date <= [date] AND discharge_date >= [date] THEN id END)) A

我对填充医院单位当前住院患者每日普查的查询有问题。是我找到查询的地方

SELECT 
    [date], COUNT (DISTINCT                                                                           
                       CASE WHEN admit_date <= [date] AND discharge_date >= [date] THEN id END)) AS census
FROM 
    dbo.patients, dbo.census
GROUP BY 
    [date]
ORDER BY 
    [date] 
共有两个表格:

dbo.具有id、入院日期和出院日期列的患者 dbo.census有一个日期列,其中包含自2017年以来的每个日期,还有一个普查列,该列为空
该查询填充“普查”列,但普查计数会在日期结束时减少到应该的较小数字。例如,出院日期有65个空值,因此今天的普查计数应为65,但查询生成的计数为8。

可能需要考虑空出院日期

SELECT [date], COUNT (DISTINCT                                                                           
CASE WHEN admit_date <= [date] AND COALESCE(discharge_date, GETDATE()) >= [date] THEN id END))
AS census

FROM dbo.patients
CROSS JOIN dbo.census

GROUP BY [date]
ORDER BY [date] 

也就是说,假设[date]是某种当前日期/时间戳。另外,根据肖恩·兰格的评论,如果您真的想要交叉连接,那么您应该在查询中指定。

稍微绕道……是时候开始使用ANSI-92样式的连接了。它们已经存在近30年了。此外,您应该养成使用别名并将别名添加到每个列的习惯,以便知道该列属于哪个表。另外,最好避免使用日期等模棱两可的名称。几号?添加日期?审查?生日?示例数据、表结构和期望的输出在这里非常有用。是的,连接应该更新。这个数据库是单独为这两个表存储的,所以不需要更明确的命名,但对于一般实践,您的建议是可靠的。谢谢,这太完美了!我会找到你的答案的原因,这样我就不会重复我的错误了。很乐意帮忙。如果患者尚未出院,则其出院日期应为空。您必须特别说明NULL,因为它是未知的。因此,如果您将任何内容与它进行比较,它将返回未知。因此,通过强制GETDATE为NULL,您实际上可以得到一个真值。希望这是有道理的。
SELECT 
    [date], COUNT (DISTINCT                                                                           
                       CASE WHEN admit_date <= [date] AND discharge_date >= [date] THEN id END)) AS census
FROM 
    dbo.patients, dbo.census
GROUP BY 
    [date]
ORDER BY 
    [date]