多表MySQL查询

多表MySQL查询,mysql,Mysql,欢迎!我有12张桌子,一年中每个月一张: January +----+-----+ | id | sale| +----+-----+ | 1 | 250 | | 3 | 500 | | 5 | 200 | | 7 | 100 | +----+-----+ February +----+-----+ | id | sale| +----+-----+ | 1 | 350 | | 2 | 400 | | 3 | 500 | | 4

欢迎!我有12张桌子,一年中每个月一张:

January

+----+-----+  
| id | sale|  
+----+-----+  
|  1 | 250 |  
|  3 | 500 |
|  5 | 200 |  
|  7 | 100 |  
+----+-----+

February

+----+-----+  
| id | sale|  
+----+-----+  
|  1 | 350 |  
|  2 | 400 |
|  3 | 500 |  
|  4 | 800 |  
+----+-----+
等等

我需要做一个查询,结果如下:

Annual Sales
+----+-----------+-----------+
| id | Sales_Jan | Sales_Feb |
+----+-----------+-----------+
|  1 |       250 |       350 |
|  2 |         0 |       400 |
|  3 |       500 |       500 |
|  4 |         0 |       800 |
|  5 |       200 |         0 |
|  7 |       100 |         0 |
+----+-----------+-----------+
其中,两个表中的匹配id不重复,其他月份缺少的id显示为0或任何其他符号,表示该id当月没有任何销售


多谢各位

您可以使用
union all
和聚合来实现这一点:

select id,
       sum(case when month = 'Jan' then sale else 0 end) as Jan_Sale,
       sum(case when month = 'Feb' then sale else 0 end) as Feb_Sale,
       . . .
       sum(case when month = 'Dec' then sale else 0 end) as Dec_Sale
from ((select 'Jan' as month, id, sale from January) union all
      (select 'Feb' as month, id, sale from February) union all
      . . .
      (select 'Dec' as month, id, sale from February)
     ) t
group by id;

您可以使用
union all
和聚合来实现这一点:

select id,
       sum(case when month = 'Jan' then sale else 0 end) as Jan_Sale,
       sum(case when month = 'Feb' then sale else 0 end) as Feb_Sale,
       . . .
       sum(case when month = 'Dec' then sale else 0 end) as Dec_Sale
from ((select 'Jan' as month, id, sale from January) union all
      (select 'Feb' as month, id, sale from February) union all
      . . .
      (select 'Dec' as month, id, sale from February)
     ) t
group by id;

您可以使用
union all
和聚合来实现这一点:

select id,
       sum(case when month = 'Jan' then sale else 0 end) as Jan_Sale,
       sum(case when month = 'Feb' then sale else 0 end) as Feb_Sale,
       . . .
       sum(case when month = 'Dec' then sale else 0 end) as Dec_Sale
from ((select 'Jan' as month, id, sale from January) union all
      (select 'Feb' as month, id, sale from February) union all
      . . .
      (select 'Dec' as month, id, sale from February)
     ) t
group by id;

您可以使用
union all
和聚合来实现这一点:

select id,
       sum(case when month = 'Jan' then sale else 0 end) as Jan_Sale,
       sum(case when month = 'Feb' then sale else 0 end) as Feb_Sale,
       . . .
       sum(case when month = 'Dec' then sale else 0 end) as Dec_Sale
from ((select 'Jan' as month, id, sale from January) union all
      (select 'Feb' as month, id, sale from February) union all
      . . .
      (select 'Dec' as month, id, sale from February)
     ) t
group by id;


下一次做一个月表,并参考他们与月!我不知道为什么每个月都要将销售额存储在单独的数据库表中,但这通常会与实体设计和数据建模背道而驰。销售就是销售,它发生的月份是销售的一个属性。表应该表示实体,而不是属性。我知道,这是工程过程的一部分,但数据库是这样交给我的,我没有修改它的权限。下次制作一个月表,并用月引用它们!我不知道为什么每个月都要将销售额存储在单独的数据库表中,但这通常会与实体设计和数据建模背道而驰。销售就是销售,它发生的月份是销售的一个属性。表应该表示实体,而不是属性。我知道,这是工程过程的一部分,但数据库是这样交给我的,我没有修改它的权限。下次制作一个月表,并用月引用它们!我不知道为什么每个月都要将销售额存储在单独的数据库表中,但这通常会与实体设计和数据建模背道而驰。销售就是销售,它发生的月份是销售的一个属性。表应该表示实体,而不是属性。我知道,这是工程过程的一部分,但数据库是这样交给我的,我没有修改它的权限。下次制作一个月表,并用月引用它们!我不知道为什么每个月都要将销售额存储在单独的数据库表中,但这通常会与实体设计和数据建模背道而驰。销售就是销售,它发生的月份是销售的一个属性。表应该表示实体,而不是属性。我知道,这是工程过程的一部分,但数据库就是这样交给我的,我没有修改它的权限。你是个圣人!非常感谢你!t前面缺少了一个“as”,但我不知道是我还是你需要编辑它。正如你所看到的,我是新来的。再次感谢您。@user3063952。我将
用作列别名,但不用于表别名。这是Oracle的标准,尽管对于大多数数据库引擎来说,
as
通常是可选的。您知道如何在Ms access上实现同样的功能吗?我被告知php是MySQL的,但是会有一个带有Ms access的控制台应用程序。提前谢谢。@user3063952。MS Access使用
iif()
而不是
case
。我想所有的工会都会在那里工作。你是个圣人!非常感谢你!t前面缺少了一个“as”,但我不知道是我还是你需要编辑它。正如你所看到的,我是新来的。再次感谢您。@user3063952。我将
用作列别名,但不用于表别名。这是Oracle的标准,尽管对于大多数数据库引擎来说,
as
通常是可选的。您知道如何在Ms access上实现同样的功能吗?我被告知php是MySQL的,但是会有一个带有Ms access的控制台应用程序。提前谢谢。@user3063952。MS Access使用
iif()
而不是
case
。我想所有的工会都会在那里工作。你是个圣人!非常感谢你!t前面缺少了一个“as”,但我不知道是我还是你需要编辑它。正如你所看到的,我是新来的。再次感谢您。@user3063952。我将
用作列别名,但不用于表别名。这是Oracle的标准,尽管对于大多数数据库引擎来说,
as
通常是可选的。您知道如何在Ms access上实现同样的功能吗?我被告知php是MySQL的,但是会有一个带有Ms access的控制台应用程序。提前谢谢。@user3063952。MS Access使用
iif()
而不是
case
。我想所有的工会都会在那里工作。你是个圣人!非常感谢你!t前面缺少了一个“as”,但我不知道是我还是你需要编辑它。正如你所看到的,我是新来的。再次感谢您。@user3063952。我将
用作列别名,但不用于表别名。这是Oracle的标准,尽管对于大多数数据库引擎来说,
as
通常是可选的。您知道如何在Ms access上实现同样的功能吗?我被告知php是MySQL的,但是会有一个带有Ms access的控制台应用程序。提前谢谢。@user3063952。MS Access使用
iif()
而不是
case
。我认为,
union all
将在那里工作。