0

在 sql 中我想显示统计数据,所以我想显示所有工作日的总和,通过显示 0 表示不存在的工作日。月,小时,年也是如此......

问题是没有表可以加入来获取缺失的日期。
有没有一种干净的方法可以做到这一点?

谢谢

编辑:数据库和数据无关紧要,但我使用的是 Oracle DB 和 Mysql,如果我想做的话,简单地说

SELECT SUM(SALES) FROM SALES_TABLE WHERE SALES_DATE BETWEEN DATE1 AND DATE2 GROUP BY WEEKDAY

如何将其更改为例如在星期日获取 0,而不是获取 SATURDAY :4, MONDAY:4

4

2 回答 2

3

您可以创建一个包含日期名称的表,然后在该表上执行左连接。

查看您拥有的表结构会有所帮助,但如果我要这样做,我会执行以下操作:

create table stats (dayname varchar(3), "value" int);
create table daynames (dayname varchar(3));
insert into stats values ('Sun', 5), ('Mon', 4), ('Wed', 13), ('Sun', 3), ('Tue', 5), ('Sat', 5), ('Mon', 32);
insert into daynames values ('Sun'),('Mon'),('Tue'),('Wed'),('Thu'),('Fri'),('Sat');

select daynames.dayname, sum("value") from daynames left outer join stats on stats.dayname=daynames.dayname group by daynames.dayname;

| dayname | sum |
|---------+-----|
| Fri     |     |
| Mon     | 36  |
| Sat     | 5   |
| Sun     | 8   |
| Thu     |     |
| Tue     | 5   |
| Wed     | 13  |

对于未在数据中表示的日期的总和,您将有空值,但您可以将它们转换为零,具体取决于您的数据库服务器。

于 2012-04-13T07:15:43.777 回答
1

在不创建表的情况下执行此操作的另一种可能方法是在 SUM 中使用 CASE 语句。这样做很可能会对性能造成很大影响,但我没有对其进行测试,对于一小部分数据,您应该不会看到太大的影响。它还将所有内容放入一个记录而不是 7 个不同的记录

SELECT SUM(CASE WHEN DAYOFWEEK(SALES_DATE) = 1 THEN SALES ELSE 0 END) AS SUNDAY,
       SUM(CASE WHEN DAYOFWEEK(SALES_DATE) = 2 THEN SALES ELSE 0 END) AS MONDAY,
       SUM(CASE WHEN DAYOFWEEK(SALES_DATE) = 3 THEN SALES ELSE 0 END) AS TUESDAY,
       SUM(CASE WHEN DAYOFWEEK(SALES_DATE) = 4 THEN SALES ELSE 0 END) AS WEDNESDAY,
       SUM(CASE WHEN DAYOFWEEK(SALES_DATE) = 5 THEN SALES ELSE 0 END) AS THURSDAY,
       SUM(CASE WHEN DAYOFWEEK(SALES_DATE) = 6 THEN SALES ELSE 0 END) AS FRIDAY,
       SUM(CASE WHEN DAYOFWEEK(SALES_DATE) = 7 THEN SALES ELSE 0 END) AS SATURDAY
FROM SALES_TABLE 
WHERE SALES_DATE BETWEEN DATE1 AND DATE2
于 2013-06-07T20:47:05.780 回答