SQL 合并两个用新名称分组的查询
SQL combine two queries grouped with new names
我不知道问题的措辞是否正确,因为我不确定自己在寻找什么。对不起...
我有一个 PHP-脚本,它创建一个饼图并从 SQL-查询中获取输入,如下所示:
Column | COUNT(Column)
x | y
例如,我要求提供性别饼图并使用:
gender | COUNT(gender)
female | 17
male | 13
或国籍饼图:[=19=]
nationality | COUNT(nationality)
us | 3
uk | 8
es | 4
我通过
这样的查询很容易得到这些结果
SELECT myColumn, COUNT(myColumn) FROM myTable GROUP BY myColumn ORDER BY COUNT(myColumn)
现在我想要一个包含 alive/dead 人的饼图。在我的 table 中,我有 bornDate 和 deceasedDate。因此,我必须做其他事情才能得到我想要的:
alive | COUNT(alive)
alive | 16
dead | 4
我可以用
让人们活着
SELECT alive.*
FROM persons AS alive
WHERE alive.deceased = NULL OR alive.deceased = '0000-00-00' AND alive.born != '0000-00-00'
和死者:
SELECT dead.*
FROM persons AS dead
WHERE NOT dead.deceased = NULL OR dead.deceased != '0000-00-00'
所以问题是,我如何将其结合起来得到
alive | COUNT(alive)
alive | 16
dead | 4
?
我猜它涉及到 COUNT() 和 GROUP BY,但我不知道如何。也许还有联合?
谢谢!
你可以通过这个查询来完成:
SELECT
case when COALESCE(deceased,'0000-00-00') AND born != '0000-00-00' then 'alive' else 'dead' end as Alive
, count(*) as Count
FROM persons
group by case when COALESCE(deceased,'0000-00-00') = '0000-00-00' AND born != '0000-00-00' then 'alive' else 'dead' end
您可以通过使用 case 语句和该 case 语句的 group by 来实现...
DECLARE @persons TABLE (
[id] int not null IDENTITY(1,1),
born varchar(10) NULL,
deceased varchar(10) NULL
)
INSERT INTO @persons
(born,deceased)
values('2019-01-01','2019-07-08')
,('2020-05-03',NULL)
,('2000-03-10','0000-00-00')
,('0000-00-00',NULL)
,('2008-01-01',NULL)
SELECT CASE WHEN ISNULL(Per.deceased,'0000-00-00') = '0000-00-00' THEN 'Alive'
WHEN ISNULL(Per.deceased, '0000-00-00') <> '0000-00-00' THEN 'Dead'
END AS [CountType]
,COUNT(*) AS Total
FROM @persons AS Per
WHERE ISNULL(Per.born,'0000-00-00') <> '0000-00-00'
GROUP BY CASE WHEN ISNULL(Per.deceased,'0000-00-00') = '0000-00-00' THEN 'Alive'
WHEN ISNULL(Per.deceased, '0000-00-00') <> '0000-00-00' THEN 'Dead'
END
上面代码的结果
CountType
Total
Alive
3
Dead
1
我不知道问题的措辞是否正确,因为我不确定自己在寻找什么。对不起...
我有一个 PHP-脚本,它创建一个饼图并从 SQL-查询中获取输入,如下所示:
Column | COUNT(Column)
x | y
例如,我要求提供性别饼图并使用:
gender | COUNT(gender)
female | 17
male | 13
或国籍饼图:[=19=]
nationality | COUNT(nationality)
us | 3
uk | 8
es | 4
我通过
这样的查询很容易得到这些结果SELECT myColumn, COUNT(myColumn) FROM myTable GROUP BY myColumn ORDER BY COUNT(myColumn)
现在我想要一个包含 alive/dead 人的饼图。在我的 table 中,我有 bornDate 和 deceasedDate。因此,我必须做其他事情才能得到我想要的:
alive | COUNT(alive)
alive | 16
dead | 4
我可以用
让人们活着SELECT alive.*
FROM persons AS alive
WHERE alive.deceased = NULL OR alive.deceased = '0000-00-00' AND alive.born != '0000-00-00'
和死者:
SELECT dead.*
FROM persons AS dead
WHERE NOT dead.deceased = NULL OR dead.deceased != '0000-00-00'
所以问题是,我如何将其结合起来得到
alive | COUNT(alive)
alive | 16
dead | 4
?
我猜它涉及到 COUNT() 和 GROUP BY,但我不知道如何。也许还有联合?
谢谢!
你可以通过这个查询来完成:
SELECT
case when COALESCE(deceased,'0000-00-00') AND born != '0000-00-00' then 'alive' else 'dead' end as Alive
, count(*) as Count
FROM persons
group by case when COALESCE(deceased,'0000-00-00') = '0000-00-00' AND born != '0000-00-00' then 'alive' else 'dead' end
您可以通过使用 case 语句和该 case 语句的 group by 来实现...
DECLARE @persons TABLE (
[id] int not null IDENTITY(1,1),
born varchar(10) NULL,
deceased varchar(10) NULL
)
INSERT INTO @persons
(born,deceased)
values('2019-01-01','2019-07-08')
,('2020-05-03',NULL)
,('2000-03-10','0000-00-00')
,('0000-00-00',NULL)
,('2008-01-01',NULL)
SELECT CASE WHEN ISNULL(Per.deceased,'0000-00-00') = '0000-00-00' THEN 'Alive'
WHEN ISNULL(Per.deceased, '0000-00-00') <> '0000-00-00' THEN 'Dead'
END AS [CountType]
,COUNT(*) AS Total
FROM @persons AS Per
WHERE ISNULL(Per.born,'0000-00-00') <> '0000-00-00'
GROUP BY CASE WHEN ISNULL(Per.deceased,'0000-00-00') = '0000-00-00' THEN 'Alive'
WHEN ISNULL(Per.deceased, '0000-00-00') <> '0000-00-00' THEN 'Dead'
END
上面代码的结果
CountType | Total |
---|---|
Alive | 3 |
Dead | 1 |