Mysql:使用count合并两列

Mysql:使用count合并两列,mysql,count,union,Mysql,Count,Union,我正在寻找以下问题的sql语句: 这是我桌子上的一段摘录 'from_city' 'to_city' New York Boston Chicago New York New York Los Angeles Dallas San Francisco Miami New York Dallas Los Angeles 预期结果应如下所示: City Count Percentage New York

我正在寻找以下问题的sql语句: 这是我桌子上的一段摘录

'from_city' 'to_city'
New York    Boston
Chicago     New York
New York    Los Angeles
Dallas      San Francisco
Miami       New York
Dallas      Los Angeles
预期结果应如下所示:

City              Count   Percentage
New York            4        33%
Los Angeles         2        17%
Dallas              2        17%
San Francisco       1         8%
Miami               1         8%
Chicago             1         8%
Boston              1         8%
因此,我需要将“from_city”和“to_city”这两个栏目合并起来,我可以:

(SELECT from_city AS City FROM table) UNION
(SELECT to_city AS City FROM table)
但现在我不知道如何在结果集中应用计数和百分比。 你能帮帮我吗

提前谢谢

SELECT City, COUNT(*) AS Count, ROUND(100*COUNT(*)/total) AS Percentage
FROM (SELECT from_city AS City
      FROM table
      UNION ALL
      SELECT to_city AS City
      FROM table
     ) AS u
CROSS JOIN (SELECT 2 * COUNT(*) AS total
            FROM table) AS t
GROUP BY City
ORDER BY Count DESC

我相信下面的查询将提供您想要的结果

SELECT 
  city, 
  count(*), 
  count(*)/(SELECT count(*)*2 FROM table)
FROM
  (SELECT from_city AS city FROM table
    union all
  SELECT to_city AS city FROM table) a
GROUP BY 
  city

您可能希望使用子查询:

SELECT
  city,
  COUNT(1) AS c,
  CONCAT(100*COUNT(1)/sums.total, '%') AS p
FROM
  (SELECT  from_city AS city FROM t
  UNION ALL
  SELECT to_city FROM t) AS cities
  CROSS JOIN
  (SELECT 
     COUNT(from_city)
    +COUNT(to_city) AS total
  FROM t) AS sums
GROUP BY
  city
ORDER BY 
  c DESC
-注意,双重计数在常见情况下不起作用(因此使用两列的计数之和)检查


此外,您还没有指定百分比的格式,即百分比中应该包含多少个符号(因为它可能是非整数),因此我将其保留原样

您必须使用
UNION ALL
。默认情况下,它是UNION DISTINCT,因此重复项将被删除。噢,快照!Barmar是正确的,答案已被修改,因为作为一个样本。使用
2*count(*)
我们会得到错误的百分比为什么表中会有空值?因为“在普通情况下”更像是表中允许空值的特殊情况。我不确定你是否理解了。对我来说,“普通情况”=所有可能的“特殊情况”(包括“一般情况”)的集合。因此,在某些情况下,我将
2*COUNT(*)
视为可能的失败
SELECT
  city,
  COUNT(1) AS c,
  CONCAT(100*COUNT(1)/sums.total, '%') AS p
FROM
  (SELECT  from_city AS city FROM t
  UNION ALL
  SELECT to_city FROM t) AS cities
  CROSS JOIN
  (SELECT 
     COUNT(from_city)
    +COUNT(to_city) AS total
  FROM t) AS sums
GROUP BY
  city
ORDER BY 
  c DESC