【问题标题】:JOIN TWO TABLES [duplicate]加入两个表[重复]
【发布时间】:2014-10-08 23:14:46
【问题描述】:

我有两个表:“Project”和“Project Monthly”。

| PROJECT_ID |  TITLE |    | ID | PROJECT_ID |  MONTH | EXPENSE |
-----------------------    --------------------------------------
|          1 | title1 |    |  1 |          1 |      1 |     100 |
|          2 | title2 |    |  2 |          1 |      2 |    2000 |
|          3 | title3 |    |  3 |          1 |      3 |     900 |
                           |  4 |          1 |      4 |     900 | 
                           |  5 |          2 |      1 |     200 |
                           |  6 |          2 |      2 |     200 |
                           |  7 |          3 |      1 |     500 | 

我想要一张这样的桌子:

| PROJECT_ID |  TITLE | MONTH_1 | MONTH_2 | MONTH_3 | MONTH_4 |
---------------------------------------------------------------
|          1 | title1 |     100 |    2000 |     900 |     900 |
|          2 | title2 |     200 |     200 |     NULL|     NULL|
|          3 | title3 |     500 |    NULL |     NULL|     NULL|

我可以只使用 JOIN 而不使用子查询来实现它吗?

谢谢!

【问题讨论】:

  • @Close voters:建议的副本是关于未知数量的列,并以动态 SQL 作为答案。这根本不适合这个问题。

标签: mysql sql join where


【解决方案1】:

您可以通过使用带有 max 的案例来获得所需的结果集,如果您有超过 4 个月的时间,下面的查询只会给出 4 个月的结果,那么您必须编写所有月份的案例,并选择一个最大值一个月的值中有更大的值,我使用了内部联接,因此如果任何项目没有每月数据并且您仍然希望它返回结果将内部联接更改为左联接,则 ProjectMonthly 中存在的项目只有这些项目将被返回

SELECT p.PROJECT_ID,p.TITLE,
MAX(CASE WHEN MONTH=1 THEN EXPENSE END) AS Month_1,
MAX(CASE WHEN MONTH=2 THEN EXPENSE END) AS Month_2,
MAX(CASE WHEN MONTH=3 THEN EXPENSE END) AS Month_3,
MAX(CASE WHEN MONTH=4 THEN EXPENSE END) AS Month_4
FROM Project p 
INNER JOIN ProjectMonthly pm 
ON p.PROJECT_ID=pm.PROJECT_ID
GROUP BY p.PROJECT_ID

Fiddle Demo

【讨论】:

  • 非常感谢。如果我有两个或更多的费用领域怎么办?而且我想要一个包含 MONTH_1_EXPENSE_1、MONTH_1_EXPENSE_2 等列的表格。
  • @Francois 然后你可以使用与MAX(CASE WHEN MONTH=1 THEN EXPENSE_1 END) AS Month_1_EXPENSE,MAX(CASE WHEN MONTH=1 THEN EXPENSE_2 END) AS Month_2_EXPENSE, 这样的费用列名称相同的大小写,等等你有多少费用列
【解决方案2】:

这样试试

select p.PROJECT_ID,p.TITLE,
case when month=1 then EXPENSE end as Month_1,
case when month=2 then EXPENSE end as Month_2,
case when month=3 then EXPENSE end as Month_3,
case when month=4 then EXPENSE end as Month_4
from Project p inner join ProjectMonthly' pm on p.PROJECT_ID=pm.PROJECT_ID

【讨论】:

  • +1 如果每个项目每月的行数不超过一行(这似乎很可能),这将起作用
【解决方案3】:

将行变成列称为透视。一种方法是group by 每个项目。该组将成为单行。在组内,您每月定义一列。该列汇总了特定月份的费用:

select  p.PROJECT_ID
,       p.TITLE
,       sum(case when m.month = 1 then m.expense end) as MONTH_1
,       sum(case when m.month = 2 then m.expense end) as MONTH_2
...
from    project p
join    monthly m 
on      p.PROJECT_ID = m.PROJECT_ID
group by 
        p.PROJECT_ID
,       p.TITLE

【讨论】:

  • 谢谢!但是,如果我有更多 Expense 列怎么办?
  • 什么意思? monthly 表中的 Expense2 列?或者monthly 表中有一个月的多行?在后一种情况下,此查询应该可以正常工作。在第一种情况下,将m.expense 替换为m.expense1 + m.expense2
  • 我的意思是,如果我想拥有像 MONTH_1_EXPENSE_1、MONTH_1_EXPENSE_2、..、MONTH_4_EXPENSE_2 这样的列怎么办?
猜你喜欢
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2022-12-24
  • 2012-04-27
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多