我有一个包含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