我有一个包含3列的表格T1:ProductBrand,purcheddate,solddate。 ProductBrand代表产品的品牌。 PurchasedDate包含我们购买产品的日期(格式为yyyy-mm),而SoldDate包含我们销售该产品的日期(格式为yyyy-mm)。例如:

ProductBrand  PurchasedDate  SoldDate
----------------------------------
Apple          2015-03      2015-05
Samsung        2014-01      2015-03
Sony           2016-02      2016-05
Sony           2013-01      2013-08
Apple          2015-05      2015-10
LG             2011-02      2014-06
Samsung        2017-02      2017-04
LG             2016-01      2016-06
LG             2018-06      2019-01


我想要一张表格,该表格针对每个品牌以及每个月(在2010-01至2019-12年之间)在库存中该特定月份我拥有该特定品牌的产品数量。即,在此示例中,我有两种Apple产品。第一个停留在2015-03和2015-06之间的库存中,第二个停留在2015-04和2015-08之间的库存中。因此,我期望一个表具有:

ProductBrand  YearMonthDate  NitemsInventory
------------  ------------   -------------------
Apple         2010-01               0
Apple         2010-02               0
...            ...                 ...
Apple         2015-03               1
Apple         2015-04               2
Apple         2015-05               2
Apple         2015-06               2
Apple         2015-07               1
Apple         2015-08               1
Apple         2015-09               0
...            ...                 ...
Apple         2019-12               0


在同一张桌子上,我希望所有品牌都具有与Apple相同的品牌。因此,如果我们有n个不同的品牌,并且t是介于(2010-01和2019-12)之间的月份数,则结束数组将具有n乘以t行。换句话说,我想每月查看每个品牌的库存中的物品数量。

我正在使用mysql,并且我想尝试对T1的ProductBrand列进行分组。但是,这不能满足我的期望。

最佳答案

我们可以使用一些丑陋的大日历表来做到这一点:

SELECT
    t.ProductBrand,
    d.YearMonthDate,
    COUNT(t.ProductBrand) AS NitemsInventory
FROM
(
    SELECT DISTINCT ProductBrand FROM yourTable
) AS p
CROSS JOIN
(
    SELECT '2010-01' AS YearMonthDate UNION ALL
    SELECT '2010-02' UNION ALL
    SELECT '2010-03' UNION ALL
    ...
    SELECT '2015-03' UNION ALL
    SELECT '2015-04' UNION ALL
    ...
    SELECT '2019-12'
) AS d
LEFT JOIN yourTable t
    ON d.YearMonthDate BETWEEN t.PurchasedDate AND t.SoldDate AND
       p.ProductBrand = t.ProductBrand
WHERE
    t.productBrand IS NOT NULL
GROUP BY
    t.ProductBrand,
    d.YearMonthDate;


这是一个演示实际查询的演示:

Demo

08-03 13:38