2016-07-11 23 views
0

我有一个主表是这样的加入多个表具有多个日期

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查询具有该加入

+0

你的问题相关的MySQL或SQLSERVER – Ajay2707

+0

对不起,我要加入到这一点。如果我需要这样做,我该怎么办? CUSTOMER_ID activity_date like_quantity comment_activity 1 - - - 2 3 16年1月1日1 2 16年2月1日5 - 2 16年6月1日 - 2 3 16年1月1日3 - 4 5/1/16 - 7 –

+0

然后是SQL Server还是mySQL?无论如何,查找PIVOT运算符(或一般枢轴,取决于您的RDBMS).. – dean

回答

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

+0

答案是很好的逻辑,但添加日期相关的条件来匹配正确的结果 – Ajay2707

+0

我没有得到这**添加日期相关的条件以匹配正确的结果**。请解释@ Ajay2707 – 1000111

+0

感谢您的帮助。我改变了想法,我需要这样的表格 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 –