【问题标题】:SQL combine two queries grouped with new namesSQL 组合使用新名称分组的两个查询
【发布时间】:2021-03-09 19:29:31
【问题描述】:

我不知道这个问题的措辞是否正确,因为我不确定我在寻找什么。对不起……

我有一个 PHP 脚本,它创建一个饼图并从 SQL 查询中获取输入,如下所示:

Column | COUNT(Column)
x      | y

例如,我要求提供性别饼图并使用:

gender | COUNT(gender)
female | 17
male   | 13

或国籍饼图:

nationality | COUNT(nationality)
us          | 3
uk          | 8
es          | 4

我可以通过这样的查询轻松获得这些结果

SELECT myColumn, COUNT(myColumn) FROM myTable GROUP BY myColumn ORDER BY COUNT(myColumn)

现在我想要一个包含活着/死去的人的饼图。在我的表中,我有出生日期和死亡日期。因此,我必须做些别的事情才能得到我想要的:

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,但我不知道怎么做。也许还有 UNION?

谢谢!

【问题讨论】:

  • deceased = NULL 是一个毫无意义的条件。它永远不会评估为真。
  • 好的,谢谢,会更新的。

标签: sql group-by count union


【解决方案1】:

您可以通过在该 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

【讨论】:

  • 感谢您的精心解答!但是我收到一个错误.. Incorrect parameter count in the call to native function 'ISNULL'。您的答案与@eshirvana 非常相似,并且该查询有效。我将研究差异。谢谢!
  • @Robbas - 不知道您为什么收到该错误消息。您使用的是 MySQL 还是 SQL? SQL ISNULL 的 MySQL 等价物是 IFNULL
  • 谢谢你,成功了。我正在使用 MariaDB。
【解决方案2】:

你可以通过这个查询来做到这一点:

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

【讨论】:

  • 谢谢!效果很好!现在我将研究它以确保我理解它(:
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 2017-05-03
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多