【发布时间】:2019-03-12 11:04:12
【问题描述】:
我有一个数据表(如下所示)
| id | date | product |
|----|-------------|---------|
| 1 | 2019-01-02 | prod 1 |
| 2 | 2019-01-02 | prod 2 |
| 3 | 2019-01-22 | prod 1 |
| 4 | 2019-02-02 | prod 1 |
| 5 | 2019-02-02 | prod 1 |
| 6 | 2019-03-02 | prod 1 |
我希望最终结果看起来像这样......
| product | 2019-01 | 2019-02 | 2019-03 |
|---------|---------|---------|---------|
| prod 1 | 2 | 3 | 0 |
| prod 2 | 1 | 0 | 0 |
简而言之,我想遍历一个日期范围内的所有产品(所有日期都包含在一个表中)。当一个月没有结果时,返回 0。我相信 COALESCE 可能是解决这个问题的方法。
我已经尝试了这两种不同的方法...在单个查询中返回所有数据并循环遍历该数据,但如果没有数据,它永远不会返回字符串或我可以使用的东西(null)。
SELECT
product_name,
count(product_name) AS count
DATE_FORMAT(date,'%Y-%m') AS date
FROM products
GROUP BY DATE_FORMAT(date,'%Y-%m'), company_name
ORDER BY date;
| product | date | count |
|---------|---------|-------|
| prod 1 | 2019-01 | 2 |
| prod 2 | 2019-01 | 1 |
| prod 1 | 2019-02 | 3 |
| prod 2 | 2019-02 | 0 | <--- this row doesn't return
另外,我尝试循环遍历所有产品,然后单独循环遍历日期,但如果表中没有日期,则再次返回没有数据,因此我的表会倾斜。
我看到其他人将日期存储在另一个表中,然后循环遍历该表,这感觉有点矫枉过正,因为我将所有日期都保存在此表中,因此我尝试将表连接到自身上,但这也不起作用。
提前感谢您的帮助。
【问题讨论】:
-
mysql 无法生成您想要的结果(使用数据作为列名),afaik。 (这是某种旋转)除非您生成以这种方式显式命名列的查询 (
select ... as `2019-01`...)。话虽如此,你不能无中生有地产生数据。要么您向它提供查询,要么您有一个包含所有(包括空)日期的表。 ;o/ 在查询中包含日期可能会起作用,但它通常很难看,而且你必须跳过一些环节。