多表MySQL查询
欢迎!我有12张桌子,一年中每个月一张:多表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
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
将在那里工作。