首页 > 解决方案 > MySQL 5.5 - 在 SELECT 中减少表

问题描述

我有一张简单的桌子和有趣的任务要做。我想从最初减少表格

+----------+------------+--------+------------+--------+------------+
| NoClosed | Closed     | NoOpen | Open       | NoPlan | Plan       |
+----------+------------+--------+------------+--------+------------+
| 1        | 2018-10-23 | NULL   | NULL       | NULL   | NULL       |
| 2        | 2018-10-22 | NULL   | NULL       | NULL   | NULL       |
| 1        | NULL       | 1      | 2018-10-23 | NULL   | NULL       |
| NULL     | NULL       | 10     | 2018-10-25 | NULL   | NULL       |
| NULL     | NULL       | NULL   | NULL       | 1      | 2018-10-27 |
| NULL     | NULL       | NULL   | NULL       | 1      | 2018-10-28 |
| 10       | 2018-10-17 | NULL   | NULL       | NULL   | NULL       |
| 1        | NULL       | 1      | 2018-10-18 | NULL   | NULL       |
+----------+------------+--------+------------+--------+------------+

对此:

Date    NoClosed    NoOpen  NoPlan
17/10/2018  10      
18/10/2018          
19/10/2018          
20/10/2018          
21/10/2018          
22/10/2018  2       
23/10/2018  3         1 
24/10/2018          
25/10/2018            10    
26/10/2018          
27/10/2018                   1
28/10/2018                   1
29/10/2018          
30/10/2018          
31/10/2018

这将从 -7 天到 +7 天,但是我无法在选择中创建包含这些日期的列。我想我需要它为所有数据提供一个枢轴点,然后对其进行计数并将其分组。

我的表格代码在这里,任何想法都将不胜感激。

CREATE TABLE Orders
(
NoClosed VARCHAR(20), 
Closed DATE, 

NoOpen VARCHAR(20),
Open DATE,

NoPlan VARCHAR(20), 
Plan DATE);




insert into Orders values (1,       "2018-10-23",   NULL,   NULL,   NULL, NULL);    
insert into Orders values (2,       "2018-10-22",   NULL,   NULL,   NULL, NULL);    

insert into Orders values (1,       NULL,       1,  "2018-10-23",   NULL,   NULL);
insert into Orders values (NULL,    NULL,       10, "2018-10-25",   NULL,   NULL);

insert into Orders values (NULL,    NULL,       NULL,   NULL,   1, "2018-10-27");   
insert into Orders values (NULL,    NULL,       NULL,   NULL,   1, "2018-10-28");
insert into Orders values (10,      "2018-10-17",   NULL,   NULL,   NULL, NULL);
insert into Orders values (1,       NULL,       1,  "2018-10-18",   NULL,   NULL);

标签: mysql

解决方案


请参阅在 sql 结果中填充空日期的最直接方法是什么(在 mysql 或 perl 端)?了解如何创建包含日期范围内所有日期的表格。然后左加入这个查询,该查询可以透视您的数据:

SELECT d.date,
    MAX(CASE WHEN o.closed = date THEN o.NoClosed END) AS NoClosed,
    MAX(CASE WHEN o.open = date THEN o.NoOpen END) AS NoCLosed,
    MAX(CASE WHEN o.plan = date THEN o.NoPlan END) AS NoPlan
FROM DateTable AS d
LEFT JOIN Orders ON d.date IN (o.closed, o.open, o.plan)
GROUP BY d.date

推荐阅读