2

我正在尝试根据日期范围(每个帖子的“星数”数)为应用程序提取一些活动报告

它有一个包含帐户 ID 的帖子表,以及一个将该 ID 与帐户相关联的“附属”表。

我知道我可以做到:

SELECT
posts.affid,
affiliates.name
sum(posts.stars) AS SEPT_2012
from posts
JOIN affiliates on posts.affid = affiliates.id
WHERE posts.timestamp BETWEEN '2012-09-01' AND '2012-10-01'
group by affid

从 9 月开始,这将得出一个包含会员 ID、名称和总“星数”的结果。单月

但是,我想做一个回溯并获取 8 月、7 月、6 月和 5 月的数字,这些数字将显示在一个查询结果中(因此结果将包括 affid、name、SEPT_2012、AUG_2012、JUL_2012 ...... ETC)。本质上,我假设对那些其他日期范围进行子查询。

有什么建议么?谢谢你的帮助!

4

2 回答 2

0

您可能想要GROUP BY EXTRACT(YEAR_MONTH FROM timestamp)(除了您想做的任何其他事情)。当然,它不会为您提供SEPT_2012AUG_2012等列,但数据会在那里。

于 2012-10-02T13:27:18.887 回答
0

虽然您将无法动态创建列,但您可以“伪造”它们并UNION为每个日期范围使用 a。在每个中UNION,您选择其他日期列和正确的列。0SUM()

与此类似的东西应该可以工作:

SELECT
    posts.affid,
    affiliates.name,
    sum(posts.stars) AS SEPT_2012,
    0 AS AUG_2012,
    0 AS JUL_2012
from
    posts
    JOIN affiliates on posts.affid = affiliates.id
WHERE
    posts.timestamp BETWEEN '2012-09-01' AND '2012-10-01'
group by affid

UNION (
    SELECT
        posts.affid,
        affiliates.name
        0 AS SEPT_2012,
        sum(posts.stars) AS AUG_2012,
        0 AS JUL_2012
    from
        posts
        JOIN affiliates on posts.affid = affiliates.id
    WHERE
        posts.timestamp BETWEEN '2012-08-01' AND '2012-09-01'
    group by affid
)
UNION (
    SELECT
        posts.affid,
        affiliates.name
        0 AS SEPT_2012,
        0 AS AUG_2012,
        sum(posts.stars) AS JUL_2012
    from
        posts
        JOIN affiliates on posts.affid = affiliates.id
    WHERE
        posts.timestamp BETWEEN '2012-07-01' AND '2012-08-01'
    group by affid
)


更新(将每个结果的所有结果组合affid在一行上)

根据评论,您希望将posts.affid单行上的每个结果与每列中的所有数据结合起来。您可以通过在上面的完整查询周围放置一个外部查询然后GROUP BY affid再次使用来实现这一点。有了这个,您应该根据要求为每一affid列和所有列设置一行。我已经更新了上面的查询以选择0每个空列而不是null“更好”的输出:

SELECT affid, name, SEPT_2012, AUG_2012, JUL_2012 FROM (
    ... full query above ...
) AS q
GROUP BY affid

更新

要从所有子查询中获取所有“星”的总和,外部 select 语句适用于:

  SELECT affid, name, sum(SEPT_2012), sum(AUG_2012), sum(JUL_2012) FROM (
    ... full query above ...
) AS q
GROUP BY affid
于 2012-10-02T13:31:24.400 回答