【问题标题】:SQL joining tables including NULL countsSQL 连接表,包括 NULL 计数
【发布时间】:2023-02-03 23:06:46
【问题描述】:

我希望这是一个简单的解决方法,我有 2 个表,其中一个是 6 个月内的几天,另一个是站点名称、日期(日期)和当天的出席人数。

我想创建一个表,其中对于每个站点,它在 6 个月期间的每一天都有一行,并采用与当天对应的站点计数,但我也希望它显示哪里有 NULL(没有那天出勤)-我可以在只有出勤天数的情况下做到这一点,但反之则不行。 :(

此处的示例数据:注意,数据保存在两个临时表中

日期表#Data

CallDate    rn
2022-08-01  1
2022-08-02  2
2022-08-03  3
2022-08-04  4
2022-08-05  5
2022-08-06  6
2022-08-07  7
2022-08-08  8

考勤表:#SiteData

SiteName    CallDate    Count
Bassetlaw   2022-08-30    1
Bassetlaw   2022-08-31    1
Bassetlaw   2022-09-13    3
Bassetlaw   2022-09-15    5
Bassetlaw   2022-09-23    1
Bassetlaw   2022-09-27    1
Bassetlaw   2022-11-21    1
Bassetlaw   2022-11-23    1
Bassetlaw   2022-11-26    1
Bassetlaw   2022-11-28    1

所以在这种情况下,我会有 6 个月的行,但只有 10 天的数据。其他日子我需要 NULL,而不仅仅是 8 行。

注意:还有更多站点,我希望对所有站点重复此操作。本质上,我想要一个表格,其中包含所有站点,每天每个站点一行,持续 6 个月,无论他们是否出席。

【问题讨论】:

  • 你使用什么数据库管理系统?此外,这在您的数据层中可能会容易得多,而不是在数据库本身中进行
  • 这听起来超级简单,应该使用 LEFT JOIN 命令来完成。还有一个问题:SiteData 表看起来每个日期只有一个条目。它是否正确?

标签: sql join


【解决方案1】:

这是通过使用 LEFT JOIN 命令完成的。

看这里:http://sqlfiddle.com/#!18/0218c/2

CREATE TABLE T_Data (
  rn int,
  CallDate date
);

CREATE TABLE T_SiteData (
  CallDate date,
  Amount int
);

INSERT INTO T_Data SELECT 1, '2022-08-01';
INSERT INTO T_Data SELECT 2, '2022-08-02';
INSERT INTO T_Data SELECT 3, '2022-08-03';
INSERT INTO T_Data SELECT 4, '2022-08-04';
INSERT INTO T_Data SELECT 5, '2022-08-05';
INSERT INTO T_Data SELECT 6, '2022-08-06';
INSERT INTO T_Data SELECT 7, '2022-08-07';
INSERT INTO T_Data SELECT 8, '2022-08-08';
INSERT INTO T_Data SELECT 10, '2022-08-09';
INSERT INTO T_Data SELECT 11, '2022-08-10';
INSERT INTO T_Data SELECT 12, '2022-08-11';
INSERT INTO T_Data SELECT 13, '2022-08-12';
INSERT INTO T_Data SELECT 14, '2022-08-13';
INSERT INTO T_Data SELECT 15, '2022-08-14';

INSERT INTO T_SiteData SELECT '2022-08-01', 1;
INSERT INTO T_SiteData SELECT '2022-08-03', 1;
INSERT INTO T_SiteData SELECT '2022-08-05', 3;
INSERT INTO T_SiteData SELECT '2022-08-12', 5;

SELECT
  d.*,
  sd.Amount AS [Count]
FROM
  T_Data AS d
LEFT JOIN
  T_SiteData AS sd
ON
  sd.CallDate = d.CallDate

这将返回以下内容:

rn  CallDate    Count
1   2022-08-01  1
2   2022-08-02  (null)
3   2022-08-03  1
4   2022-08-04  (null)
5   2022-08-05  3
6   2022-08-06  (null)
7   2022-08-07  (null)
8   2022-08-08  (null)
10  2022-08-09  (null)
11  2022-08-10  (null)
12  2022-08-11  (null)
13  2022-08-12  5
14  2022-08-13  (null)
15  2022-08-14  (null)

我使用了 MS SQL 服务器语法。但是 SELECT 查询在几乎所有其他 DBMS 上应该是相同的。

如果表 SiteData 包含每个 CallDate 的多个条目,则需要调整查询。但是您的示例仅显示每个 CallDate 的一个条目。

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2020-12-24
    相关资源
    最近更新 更多