我有一个 SQL 查询和结果表如下:
SELECT *
FROM Table A
WHERE ID = 'A' and task = 'jump'
身份证 | 任务 | 星期几 | 时间 |
---|---|---|---|
A | 跳 | 星期一 | 3 |
A | 跳 | 星期二 | 4 |
A | 跳 | 周三 | 11 |
但我希望结果表显示一周中剩余的天数,并用 0 表示小时:
身份证 | 任务 | 星期几 | 时间 |
---|---|---|---|
A | 跳 | 星期一 | 3 |
A | 跳 | 星期二 | 4 |
A | 跳 | 周三 | 11 |
A | 跳 | 星期四 | 0 |
A | 跳 | 周五 | 0 |
A | 跳 | 星期六 | 0 |
A | 跳 | 周日 | 0 |
我创建了一个临时表,但它只填充 DayofWeek 和小时数,但为 ID 和 Task 列留下空值。
DROP TABLE IF EXISTS #dayofweek;
CREATE TEMP TABLE #dayofweek (
dayofweek VARCHAR (50)
,hours INT
);
INSERT INTO #dayofweek (
dayofweek
,hours
)
VALUES
('sunday',0)
,('monday',0)
,('tuesday',0)
,('wednesday',0)
,('thursday',0)
,('friday',0)
,('saturday',0);
身份证 | 任务 | 星期几 | 时间 |
---|---|---|---|
A | 跳 | 星期一 | 3 |
A | 跳 | 星期二 | 4 |
A | 跳 | 周三 | 11 |
星期四 | 0 | ||
周五 | 0 | ||
星期六 | 0 | ||
周日 | 0 |
我怎样才能完成这个表格,我有这个适合各种ID和任务的情况。
临时表只需包含星期几。所有其他值都可以通过 COALESCE 函数获得,如果第一个参数不为空,则返回第一个参数,否则返回第二个参数。
SELECT COALESCE(A.ID, 'A'), COALESCE(A.task, 'jump'), W.DayofWeek, COALESCE(A.Hours, 0)
FROM
#dayofweek W
LEFT JOIN Table A
ON
W.dayofweek = A.DayofWeek AND
A.ID = 'A' AND A.task = 'jump'
请注意,我们必须将所有条件包含到 JOIN 子句中,以便 LEFT OUTER JOIN 正常工作,因为条件应用于右表。