如何解决这个选择查询

时间:2017-07-07 15:12:21

标签: php mysql

我的MySQL数据库中有两个表。一个存储一个特定频道的一年中一个月的金额。我有一些在另一个表中定义的通道。 以下是带有示例数据的两个表:

Table income:
ID | Year | Month | amount | channelID 
    example:
1  | 2017 | 05    | 7.13   | 1
2  | 2017 | 05    | 12.03  | 2
3  | 2017 | 06    | 1.56   | 1
4  | 2017 | 06    | 0.30   | 2


Table channel: 
ID | title            | url
example:
1  | Affiliate Site 1 | http://url1.tld
2  | Affiliate Site 2 | http://url2.tld

现在我想生成一个查询,它给出一个这样的输出:

Expected Output:
Year | Month | amount ch1 | amount ch2
example: 
2017 | 05    | 7.13       | 12.03
2017 | 06    | 1.56       | 0.30

我对编写mysql查询有基本的了解,但我无法解决这个问题。我想一起加入这些表,但这不是解决方案。 如何在一个输出行中组合由月份和年份标识的一个表的两个(稍后更多)行?

2 个答案:

答案 0 :(得分:0)

将返回您所问的内容的查询:

SELECT `Year`
, `Month`
, SUM(IF(`channelID` = 1, `amount`, 0)) 'amount ch1'
, SUM(IF(`channelID` = 2, `amount`, 0)) 'amount ch2'
FROM `income`
GROUP BY `Year`, `Month`;

对于任意数量的频道,将返回与上述相同的脚本:

SET @query = (
    SELECT
        CONCAT(
            'SELECT `Year`' ,
            ', `Month`',
            GROUP_CONCAT(
                ', SUM(IF(`channelID` = ', `id`, ', `amount`, 0)) `amount ch', `id`, '` '
                SEPARATOR ''
            ),
            'FROM `income` ',
            'GROUP BY `Year`, `Month`'
        )
    FROM `channel`
);

PREPARE stmt FROM @query;

EXECUTE stmt;

以上是基于通道表中的数据生成查询并将其存储在@query变量中。然后使用此查询准备一个语句并执行它。

答案 1 :(得分:0)

尝试使用groupid by channelid和按金额订购。