MySQL 5.5-在SELECT中缩小表

时间:2018-10-24 15:26:46

标签: mysql

我有一个简单的表格和有趣的任务。我想从最初的表格中减少

+----------+------------+--------+------------+--------+------------+
| 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天,但是我无法在select中使用这些日期创建列。我想我需要它为所有数据提供一个枢轴点,然后对其进行计数和分组。

我的表格代码在这里,任何想法都会受到赞赏。

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);

1 个答案:

答案 0 :(得分:0)

有关如何创建包含日期范围内所有日期的表,请参见What is the most straightforward way to pad empty dates in sql results (on either mysql or perl end)?。然后,通过查询来关联您的数据,以将其连接起来:

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