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