在聚合视图

时间:2018-06-13 05:44:28

标签: mysql

我认为聚合和分组付费存根的生效日期是过去的:

SELECT 
        `pay_stubs`.`employee_id` AS `employee_id`,
        YEAR(`pay_stubs`.`effective_date`) AS `year`,
        QUARTER(`pay_stubs`.`effective_date`) AS `quarter`,
        ROUND(SUM(`pay_stubs`.`gross`), 2) AS `gross`
        -- more summed fields here --
    FROM
        `pay_stubs`
    WHERE
        (`pay_stubs`.`effective_date` <= CURDATE())
    GROUP BY `pay_stubs`.`employee_id`, YEAR(`pay_stubs`.`effective_date`) , QUARTER(`pay_stubs`.`effective_date`)
    ORDER BY YEAR(`pay_stubs`.`effective_date`) , QUARTER(`pay_stubs`.`effective_date`) , `pay_stubs`.`employee_id`

我在很多方面使用这种观点。我查询它的特定employee_ids集;我查询特定的年份和/或季度。我甚至有基于这种观点的子视图。

我希望能够做的是将日期传递给此视图以使用而不是CURDATE()。然后,我可以询问特定时间的汇总数据。这可以让我测试过去或未来的数据。但由于您无法将参数传递给MySQL中的视图,因此该视图与系统时间结合。

如何在MySQL视图的where子句中实现类似动态日期的操作?

如果我将它设为存储过程,我可以传递日期参数,但是我失去了视图的优点。

1 个答案:

答案 0 :(得分:0)

最简单的方法,恕我直言,就是从视图中完全删除where子句:

SELECT 
    `pay_stubs`.`employee_id` AS `employee_id`,
    YEAR(`pay_stubs`.`effective_date`) AS `year`,
    QUARTER(`pay_stubs`.`effective_date`) AS `quarter`,
    ROUND(SUM(`pay_stubs`.`gross`), 2) AS `gross`
    -- more summed fields here --
FROM
    `pay_stubs`
GROUP BY `pay_stubs`.`employee_id`, YEAR(`pay_stubs`.`effective_date`) , QUARTER(`pay_stubs`.`effective_date`)
ORDER BY YEAR(`pay_stubs`.`effective_date`) , QUARTER(`pay_stubs`.`effective_date`) , `pay_stubs`.`employee_id`

仅在查询时应用条件,例如:

SELECT 
    *
FROM
    `pay_stubs`
WHERE
    `employee_id` = 123 AND .`effective_date` <= CURDATE()