SQL Group By-将结果作为单行而不是多行返回(展平结果)

SQL Group By-将结果作为单行而不是多行返回(展平结果),sql,group-by,flatten,Sql,Group By,Flatten,我有以下工作表: job_id | is_full_time | is_short_term 1 | 0 | 0 2 | 0 | 1 3 | 1 | 0 4 | 1 | 1 我有下面的查询,得到4行结果 SELECT is_full_time, is_short_term, COUNT(CASE WHEN is_full_t

我有以下工作表:

job_id | is_full_time | is_short_term 
     1 |      0       |      0
     2 |      0       |      1
     3 |      1       |      0
     4 |      1       |      1
我有下面的查询,得到4行结果

SELECT is_full_time, is_short_term, 
COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END) AS FT_Long, 
COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END) AS FT_Short,
COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END) AS PT_Long, 
COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END) AS PT_Short
FROM job
GROUP by is_full_time, is_short_term
我的结果如下所示:

FT_Long | FT_Short | PT_Long | PT_Short
    1   0     0     0
    0   1     0     0
    0   0     1     0
    0   0     0     1
如何将此结果合并到单个结果行中

我想看看这个:

 FT_Long | FT_Short | PT_Long | PT_Short
        1   1     1     1

通常,此模板适用于以下情况:

SELECT SUM(FT_Long) as FT_Long, SUM(FT_Short) AS FT_Short, SUM(PT_Long) AS PT_Long, SUM(PT_Short) AS PT_Short
FROM
(
  SELECT is_full_time, is_short_term, 
  COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END) AS FT_Long, 
  COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END) AS FT_Short,
  COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END) AS PT_Long, 
  COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END) AS PT_Short
  FROM job
  GROUP by is_full_time, is_short_term
) T
在这种情况下,我相信您将获得与以下相同的结果,这将取决于您的数据中还有哪些内容需要原始查询中的group by

  SELECT 
  SUM(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE 0 END) AS FT_Long, 
  SUM(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE 0 END) AS FT_Short,
  SUM(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE 0 END) AS PT_Long, 
  SUM(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE 0 END) AS PT_Short
  FROM job

通常,此模板适用于以下情况:

SELECT SUM(FT_Long) as FT_Long, SUM(FT_Short) AS FT_Short, SUM(PT_Long) AS PT_Long, SUM(PT_Short) AS PT_Short
FROM
(
  SELECT is_full_time, is_short_term, 
  COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END) AS FT_Long, 
  COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END) AS FT_Short,
  COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END) AS PT_Long, 
  COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END) AS PT_Short
  FROM job
  GROUP by is_full_time, is_short_term
) T
在这种情况下,我相信您将获得与以下相同的结果,这将取决于您的数据中还有哪些内容需要原始查询中的group by

  SELECT 
  SUM(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE 0 END) AS FT_Long, 
  SUM(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE 0 END) AS FT_Short,
  SUM(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE 0 END) AS PT_Long, 
  SUM(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE 0 END) AS PT_Short
  FROM job

您发布的结果与select语句不匹配。具体来说,您的select语句包括is_全职和is_短期。如果您将其从select中删除,则可以通过将其从组中删除

SELECT
COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END) AS FT_Long, 
COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END) AS FT_Short,
COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END) AS PT_Long, 
COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END) AS PT_Short
FROM job

您发布的结果与select语句不匹配。具体来说,您的select语句包括is_全职和is_短期。如果您将其从select中删除,则可以通过将其从组中删除

SELECT
COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END) AS FT_Long, 
COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END) AS FT_Short,
COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END) AS PT_Long, 
COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END) AS PT_Short
FROM job

您可以通过和求和行安全地删除
组,而不是对它们进行计数

SELECT
    SUM(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END) AS FT_Long, 
    SUM(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END) AS FT_Short,
    SUM(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END) AS PT_Long, 
    SUM(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END) AS PT_Short
FROM job

您可以通过
和求和行安全地删除
组,而不是对它们进行计数

SELECT
    SUM(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END) AS FT_Long, 
    SUM(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END) AS FT_Short,
    SUM(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END) AS PT_Long, 
    SUM(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END) AS PT_Short
FROM job
试试这个。SUM()可用于计算列的和

SELECT is_full_time, is_short_term, 
SUM(COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END)) AS FT_Long, 
SUM(COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END)) AS FT_Short,
SUM(COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END)) AS PT_Long, 
SUM(COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END)) AS PT_Short
FROM job
GROUP by is_full_time, is_short_term
试试这个。SUM()可用于计算列的和

SELECT is_full_time, is_short_term, 
SUM(COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 0 THEN 1 ELSE NULL END)) AS FT_Long, 
SUM(COUNT(CASE WHEN is_full_time = 1 AND is_short_term = 1 THEN 1 ELSE NULL END)) AS FT_Short,
SUM(COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 0 THEN 1 ELSE NULL END)) AS PT_Long, 
SUM(COUNT(CASE WHEN is_full_time = 0 AND is_short_term = 1 THEN 1 ELSE NULL END)) AS PT_Short
FROM job
GROUP by is_full_time, is_short_term

Group by显示要分组的列的唯一值。这就是说,您没有对聚合列进行分组,因此您得到的是它们的全部输出。尝试对所有列进行分组,看看会发生什么。您使用的是哪种DBMS?博士后?Oracle?分组依据显示要分组的列的唯一值。这就是说,您没有对聚合列进行分组,因此您得到的是它们的全部输出。尝试对所有列进行分组,看看会发生什么。您使用的是哪种DBMS?博士后?甲骨文?看来这已经搞定了!非常感谢您快速简单的回复!看来这已经搞定了!非常感谢您快速简单的回复!为此,我看到以下错误:“job.is_full_time”列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY中clause@AdamLevitt你用的是哪一个数据库,我看到以下错误:“job.is\u full\u time”列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY中clause@AdamLevitt您使用的是哪个数据库?