Sql server 从出生/死亡表计算人口表
我有一个表格,下面是一个例子,列出了人们及其出生和死亡年份(9999表示一个活着的人) 我想计算这些年的人口。对于上面显示的示例,输出如下所示。行末尾的生还者列表仅用于演示目的,我的输出中不需要它Sql server 从出生/死亡表计算人口表,sql-server,tsql,Sql Server,Tsql,我有一个表格,下面是一个例子,列出了人们及其出生和死亡年份(9999表示一个活着的人) 我想计算这些年的人口。对于上面显示的示例,输出如下所示。行末尾的生还者列表仅用于演示目的,我的输出中不需要它 year | population 2001 | 1 (1) 2002 | 3 (1,2,3) 2003 | 2 (1,3) 2004 | 3 (1,3,4) 200
year | population
2001 | 1 (1)
2002 | 3 (1,2,3)
2003 | 2 (1,3)
2004 | 3 (1,3,4)
2005 | 4 (1,3,4,5)
2006 | 4 (1,3,4,5)
2007 | 4 (1,3,4,5)
2008 | 3 (1,4,5)
2009 | 2 (1,5)
2010 | 3 (1,5,6)
2011 | 3 (1,5,6)
2012 | 2 (1,5)
我可以写一个C#程序,循环原始表中的每一行,增加出生和死亡年份之间的每一年的人口数。但是,我需要完全在TSQL脚本中完成。我是TSQL新手。我该怎么做呢?如果已经讨论过类似的问题,请告诉我。多谢各位
DECLARE @t TABLE(person INT, born INT, died INT);
INSERT @t VALUES
(1,2001,9999),
(2,2002,2003),
(3,2002,2008),
(4,2004,2009),
(5,2005,9999),
(6,2010,2012);
DECLARE @start INT, @end INT;
SELECT @start = 2001, @end = 2012;
;WITH n(y) AS
(
SELECT TOP (@end - @start + 1)
@start - 1 + ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects
)
SELECT
[year] = n.y,
population = SUM(CASE WHEN n.y >= t.born AND n.y < t.died THEN 1 ELSE 0 END)
FROM n CROSS JOIN @t AS t GROUP BY n.y;
FWIW我刚刚开始了一系列关于这件事的博客:
什么版本的sql server?@Vijay嗯,我不知道。但我遇到过这种模式,知道有一个简单的解决方案。:-)
DECLARE @t TABLE(person INT, born INT, died INT);
INSERT @t VALUES
(1,2001,9999),
(2,2002,2003),
(3,2002,2008),
(4,2004,2009),
(5,2005,9999),
(6,2010,2012);
DECLARE @start INT, @end INT;
SELECT @start = 2001, @end = 2012;
;WITH n(y) AS
(
SELECT TOP (@end - @start + 1)
@start - 1 + ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects
)
SELECT
[year] = n.y,
population = SUM(CASE WHEN n.y >= t.born AND n.y < t.died THEN 1 ELSE 0 END)
FROM n CROSS JOIN @t AS t GROUP BY n.y;
year population
---- ----
2001 1
2002 3
2003 2
2004 3
2005 4
2006 4
2007 4
2008 3
2009 2
2010 3
2011 3
2012 2