【问题标题】:Joining multiple tables with multiple dates连接具有多个日期的多个表
【发布时间】:2016-07-11 14:09:58
【问题描述】:

我有一个像这样的主表

customer_id  Customer_name
1             A
2             B
3             C
4             D

而且我有多个用户活动表。我只给出了 2 个这样的表的示例,但是有 20 个这样的表

表 1:

customer_id     activity_date   No_of_likes
2                1/1/16          2
3                1/1/16          3
2                2/1/16          5
2                1/1/16          1

表 2:

customer_id     activity_date   No_of_comments
2                1/1/16          1
4                5/1/16          7
2                6/1/16          2

这是我需要的决赛桌。我没有主日历表,我不确定加入以获得以下输出的方法

customer_id     activity_name   activity_date    quantity
1                -                  -              -
2               Likes             1/1/16            3
2               Likes             2/1/16            5
2               Comments          1/1/16            1
2               Comments          6/1/16            2
3               Likes             1/1/16            3
4               Comments          5/1/16            7

而且我还需要这样的输出。我认为合并解决了上述问题,但我不确定如何执行以下操作

  customer_id      activity_date    like_quantity    comment_activity 
     1                 -                -                     - 
     2                1/1/16            3                     1 
     2                2/1/16            5                     - 
     2                6/1/16            -                     2 
     3                1/1/16            3                     - 
     4                5/1/16            -                     7

希望我很清楚。请帮助我进行 SQL 查询以进行此连接

【问题讨论】:

  • 你的问题与mysql或sqlserver有关
  • 很抱歉添加此内容。如果我需要它,我该怎么办? customer_id activity_date like_quantity comment_activity 1 - - - 2 1/1/16 3 1 2 2/1/16 5 - 2 6/1/16 - 2 3 1/1/16 3 - 4 5/1/16 - 7跨度>
  • 那是 SQL Server 还是 mySQL?无论如何,查找 PIVOT 运算符(或一般而言,取决于您的 RDBMS)..
  • 为什么没有 1 个“活动”表?

标签: mysql join left-join


【解决方案1】:

你可以试试这个:

使用UNIONLEFT JOIN 你可以做到这一点。

SELECT 
  your_master_table.customer_id,
  COALESCE(t.activity_name,'-') AS activity_name,
  COALESCE(t.activity_date,'-') AS activity_date,
  COALESCE(t.quantity,'-') AS quantity
FROM your_master_table

LEFT JOIN 
(
    SELECT 
    customer_id,
    activity_date,
    No_of_likes AS quantity,
    'Likes' AS activity_name
    FROM TABLE_1

    UNION 

    SELECT 
    customer_id,
    activity_date,
    No_of_comments AS quantity,
    'Comments' AS activity_name
    FROM TABLE_2

) AS t
ON your_master_table.customer_id = t.customer_id
ORDER BY your_master_table.customer_id;

SQL FIDDLE DEMO

对您的示例输入运行上述查询,您将获得以下输出:

输出

| customer_id | activity_name | activity_date | quantity |
|-------------|---------------|---------------|----------|
|           1 |             - |             - |        - |
|           2 |      Comments |    2016-01-01 |        1 |
|           2 |      Comments |    2016-01-06 |        2 |
|           2 |         Likes |    2016-01-01 |        2 |
|           2 |         Likes |    2016-01-02 |        5 |
|           2 |         Likes |    2016-01-01 |        1 |
|           3 |         Likes |    2016-01-01 |        3 |
|           4 |      Comments |    2016-01-05 |        7 |

编辑:

根据您的需求变化

SELECT 
your_master_table.customer_id,
COALESCE(DATE_FORMAT(t.activity_date,'%d/%m/%y'),'-') AS activity_date,
COALESCE(SUM(CASE WHEN t.activity_name = 'Likes' THEN t.quantity END),'-') AS like_quantity,
COALESCE(SUM(CASE WHEN t.activity_name = 'Comments' THEN t.quantity END),'-') AS comment_activity
FROM your_master_table

LEFT JOIN 
(
    SELECT 
    customer_id,
    activity_date,
    No_of_likes AS quantity,
    'Likes' AS activity_name
    FROM TABLE_1

    UNION 

    SELECT 
    customer_id,
    activity_date,
    No_of_comments AS quantity,
    'Comments' AS activity_name
    FROM TABLE_2

) AS t
ON your_master_table.customer_id = t.customer_id
GROUP BY your_master_table.customer_id,t.activity_date
ORDER BY your_master_table.customer_id;

SQL FIDDLE DEMO

【讨论】:

  • 答案是很好的逻辑,但添加与日期相关的条件以匹配正确的结果
  • 我没有得到这个添加日期相关条件以匹配正确结果。请解释@Ajay2707
  • 感谢您的帮助。我改变了主意,我需要这样的表格 customer_id activity_date like_quantity comment_activity 1 - - - 2 1/1/16 3 1 2 2/1/16 5 - 2 6/1/16 - 2 3 1/1/ 16 3 - 4 5/1/16 - 7
  • 使用UNION ALL 而不是UNION ;)。
  • 它不会将其删除,因为它是一个不同的活动,我不想删除数据
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 2021-06-20
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多