【问题标题】:SQL Adding the number of occurrences from different tablesSQL添加来自不同表的出现次数
【发布时间】:2013-12-26 16:01:09
【问题描述】:

我已经写了一个查询:

SELECT  `name` , COUNT( * ) FROM  `daily` GROUP BY  `Name` 
UNION 
SELECT  `name` , COUNT( * ) FROM  `monday` GROUP BY  `Name` 

我得到了这个结果

Name  |  Count(*)
-------------------

Person 1 | 10 |

Person 2 | 05 |

Person 3 | 00 |

Person 1 | 08 |

Person 2 | 10 |

我只是想得到这个结果:

Name  |  Count(*)
-------------------
Person 1 | 18 |

Person 2 | 15 |

Person 3 | 00 |

我想将两个表中的两个值与同一个“名称”相加。我在这里使用什么连接命令?

【问题讨论】:

  • 我正在使用 MySQL。抱歉打错标签了:-(

标签: mysql sql addition


【解决方案1】:
SELECT [name], Sum(NameCount) as [Count] 
FROM (SELECT [name] , COUNT(*) AS NameCount
    FROM daily GROUP BY [name] 
  UNION ALL SELECT [name] , COUNT(*) AS NameCount 
    FROM monday GROUP BY [name] ) AS Counts
GROUP BY [name]

【讨论】:

  • 我是为 SQL Server 写的,但概念应该是一样的。
  • 这会返回语法错误,我也尝试了其他一些方法,但它仍然给出 #1064 - 你在第 1 行的 SQL 语法有错误
  • 我假设你不能在 MySQL 中使用 []。
【解决方案2】:

这未经测试

select name, SUM(total)
from ( 
  SELECT name , COUNT( * ) as total
  FROM daily 
  GROUP BY Name 

  UNION 

  SELECT name ,COUNT( * ) as total
  FROM monday 
  GROUP BY Name 
) 
GROUP BY name;

希望这可行:)

【讨论】:

  • 返回错误:#1248 - 每个派生表都必须有自己的别名
  • 在这种情况下你应该使用union all。否则,如果一个名称在两个表中具有相同的计数,您将只能获得该值(当它应该是该值的两倍时)。
【解决方案3】:

您想在聚合之前执行union

select name, count(*)
from (select name from daily union all select name from monday) t
group by name;

您也可以预先聚合这些值,尽管我不确定 MySQL 这样做是否会提高性能:

select name, sum(cnt)
from ((select name, count(*) as cnt from daily group by name)
      union all
      (select name, count(*) as cnt from monday group by name)
     ) t
group by name;

【讨论】:

  • 完美运行 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多