从他们的DOB中获得前10个国家的40岁以上人口? SQL

时间:2016-01-16 09:52:15

标签: sql sql-server

我有表人员,我有领域

   pID , pName  , pDateOfBirth  , pCountry 

现在我在数据库中有10万人或以上

问题?我想要10个国家的名字pCountry有40岁以上的人?

我的努力是

 select TOP 10  Count(pid) as ratio ,PCountry, datediff(pDOB, Date.Now) as 
 age where age >  '40' Group By country

我想要的是这个

      Pak = 555
      INDIA = 6666
      USA= 88
      Aus = 557

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望按年龄超过40岁的人数排在国家之列,因此分组应仅限于国家/地区。

<强>设置

-- drop table Person
create table Person
(
    pID INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_Person PRIMARY KEY,
    pDateOfBirth DATE,
    pCountry VARCHAR(3)
)
GO

INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19740101'), 'BEL' 
FROM sys.messages
GO

INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19730101'), 'NED' 
FROM sys.messages
GO

INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19760101'), 'DEU' 
FROM sys.messages
GO

INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19750101'), 'ROM' 
FROM sys.messages
GO

INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19740615'), 'USA' 
FROM sys.messages
GO

<强>查询

DECLARE @today DATE = GETDATE()
DECLARE @age INT = 40

SELECT TOP 10 pCountry, COUNT(1) cnt
FROM Person
WHERE DATEDIFF(day, pDateOfBirth, @today) >= @age * 365.25
GROUP BY pCountry
ORDER BY cnt DESC

我使用了DATEDIFFday选项,因为使用年份只会在年级执行差异,因此仍然会包含19761201中出生的人(这在人口统计学上并不正确)。< / p>

此外,365.25代替365用于弥补闰年。但是,这可能仍会导致1天的错误,具体取决于当前的日期(我认为这在讨论年龄和大数据时非常合理)。

<强> [编辑]

正如dnoeth正确指出的那样,日期差异逻辑可以被还原并因此被简化。所以,条件成为:

WHERE pDateOfBirth <= DATEADD(year, -40, @today)

答案 1 :(得分:0)

"UPDATE mineraltable "
    . "SET LocationID='$LocationID', ItemTypeID='$ItemTypeID', ImageID='$ImageID', DonatorID='$DonatorID' "
    . "WHERE ItemID='$ItemID'"

答案 2 :(得分:0)

评论太长了。

如果您想测量年龄,请不要使用datediff()。正如文档所述,datediff()计算两个日期之间的时间单位结束次数。也就是说,它返回“2015-12-31”和“2015-01-01”之间的差异。但它为'2015-01-01'和'2015-12-31'返回0。

相反,请使用dateadd()

where dob < daeadd(year, -40, getdate())

这适用于您可能选择的任何解决方案。