Mysql 如何对联合中不同表的Id进行求和和计数

Mysql 如何对联合中不同表的Id进行求和和计数,mysql,sql,Mysql,Sql,我有3张表,分别是议会、车站税、市场税,车站表被连接起来以获得车站税中的议会。 我需要通过议会获得车站税+市场税的总和数据,并获得投标总额 各表如下: councils ---------------+----------+ | council_id | Name | +--------------+----------+ | 1 | LSK | ---------------+----------+ | 2 | KBW

我有3张表,分别是议会、车站税、市场税,车站表被连接起来以获得车站税中的议会。 我需要通过议会获得车站税+市场税的总和数据,并获得投标总额

各表如下:

councils
---------------+----------+
| council_id   | Name     |
+--------------+----------+
| 1            | LSK      |
---------------+----------+
| 2            | KBW      |
---------------+----------+


station_levy
------------------+-------------+-----------------+
| station_levy_id | station_id  | amount_tendered |
+-----------------+-------------+-----------------+
|       1         |   3         |    10.00        |
+-----------------+-------------+-----------------+
|       2         |   3         |    10.00        |
+-----------------+-------------+-----------------+
|       3         |   1         |    5.00         |
+-----------------+-------------+-----------------+


(station_id = 1 is found in the LSK council_id=1  And station_id = 3 is found in the KBW council_id=2)

market_levy
------------------+-------------+-----------------+
| market_levy_id  | council_id  | amount_tendered |
+-----------------+-------------+-----------------+
|       1         |   1         |    5.00         |
+-----------------+-------------+-----------------+
|       2         |   2         |    5.00         |
+-----------------+-------------+-----------------+
|       3         |   1         |    5.00         |
+-----------------+-------------+-----------------+
mysql

预期结果

------------------+-------------+-----------------+
| council_name    | count       | revenue         |
+-----------------+-------------+-----------------+
|      LSK        |   3         |    15.00        |
+-----------------+-------------+-----------------+
|      KBW        |   3         |    25.00        |
+-----------------+-------------+-----------------+


你混淆了工会中所有匹配议会id和电台id、议会id的投标金额、市场id和投标金额的列

然后,在主查询中,您尝试访问market_levy.market_levy_id和st.station_levy_id,但这些列不可访问,因为您从名为totalCouncilRevenue的子查询中选择,而不是从标有market_levy和st的表中选择

您的查询已修复:

SELECT 
  c.council_name, 
  COUNT(*) AS transaction_count,
  SUM(amount_tendered) AS revenue
FROM councils c 
JOIN
(
  SELECT council_id, amount_tendered
  FROM market_levy  
  WHERE transaction_date >= CURDATE() 
  UNION ALL
  SELECT s.council_id, st.amount_tendered 
  FROM station_levy st    
  JOIN stations s ON s.station_id = st.station_id
  WHERE st.transaction_datetime >= CURDATE()
) totalCouncilRevenue USING (council_id)
GROUP BY council_id, c.council_name 
ORDER BY SUM(amount_tendered) DESC;
我更喜欢在加入之前进行聚合,不过:

SELECT 
  c.council_name, 
  COALESCE(t1.cnt, 0) + COALESCE(t2.cnt, 0) AS transaction_count,
  COALESCE(t1.total, 0) + COALESCE(t2.total, 0) AS revenue
FROM councils c 
LEFT JOIN
(
  SELECT council_id, SUM(amount_tendered) as total, COUNT(*) as cnt
  FROM market_levy  
  WHERE transaction_date >= CURDATE() 
  GROUP BY council_id
) t1 USING (council_id)
LEFT JOIN
(
  SELECT s.council_id, SUM(st.amount_tendered) as total, COUNT(*) as cnt
  FROM station_levy st    
  JOIN stations s ON s.station_id = st.station_id
  WHERE st.transaction_datetime >= CURDATE()
  GROUP BY s.council_id
) t2 USING (council_id)
ORDER BY revenue DESC;

此类查询通常不太容易出错,有时速度更快,因为它们可以更有效地使用索引。

您使用的是哪种MySQL版本?示例数据中缺少表transactions和transactions\u station\u levy。你能添加它们吗?MONTHtransaction\u date=CURDATE不能工作。它会将一个月数(例如9)与一个日期(例如日期“2020-09-02”)进行比较。在显示查询时,您应该告诉我们为什么它对您不起作用。您是否收到错误消息或行太多或太少,或错误的总和或其他信息?我忘了正确编辑查询谢谢,这正是我所期望的
SELECT 
  c.council_name, 
  COALESCE(t1.cnt, 0) + COALESCE(t2.cnt, 0) AS transaction_count,
  COALESCE(t1.total, 0) + COALESCE(t2.total, 0) AS revenue
FROM councils c 
LEFT JOIN
(
  SELECT council_id, SUM(amount_tendered) as total, COUNT(*) as cnt
  FROM market_levy  
  WHERE transaction_date >= CURDATE() 
  GROUP BY council_id
) t1 USING (council_id)
LEFT JOIN
(
  SELECT s.council_id, SUM(st.amount_tendered) as total, COUNT(*) as cnt
  FROM station_levy st    
  JOIN stations s ON s.station_id = st.station_id
  WHERE st.transaction_datetime >= CURDATE()
  GROUP BY s.council_id
) t2 USING (council_id)
ORDER BY revenue DESC;