如何获取公司未在 Sql 中记录的每个公司的日期?
Posted
技术标签:
【中文标题】如何获取公司未在 Sql 中记录的每个公司的日期?【英文标题】:How To get Dates for each Company that company has not record In Sql? 【发布时间】:2018-07-14 06:12:40 【问题描述】:我有一个包含这些列的表:
id, date, CompanyId, Value,..
我想为每个没有数据的公司选择日期
CompanyId | Date (company has no data)
----------+-----------------------------
x | 2017-07-14
y | 2017-07-05
【问题讨论】:
您可能希望在此处使用日历表。 【参考方案1】:从 CalenderTable 使用并使用开始日期,例如 -7
;WITH dates AS (
SELECT distinct Date
FROM yourtable
WHERE (Date > DATEADD(day, - 7, CONVERT(date, SYSDATETIME())))
),
companies AS (
SELECT CompanyId
FROM yourtable
WHERE (Date = DATEADD(day, - 7, CONVERT(date, SYSDATETIME())))
)
SELECT distinct c.CompanyId, CAST(d.Date AS Date) Date
FROM yourtable c
CROSS JOIN dates d
LEFT JOIN yourtable t
ON c.CompanyId = t.CompanyId AND d.Date = t.Date
join CalenderTable a on d.Date=a.Date
WHERE t.CompanyId IS NULL
ORDER BY c.CompanyId, Date
【讨论】:
【参考方案2】:我们可以尝试使用日历表的方法。下面标记为 dates
的第一个 CTE 生成 2017 年的所有日期。然后我们将其交叉连接到另一个 CTE companies
,它会找到所有出现在您的表中的唯一公司。通过将此叉积左连接到您的表中,我们可以找到每家公司缺少数据的日期。
DECLARE @ENDDATE DATETIME
SET @START_DATE = '20170101'
SET @ENDDATE = '20171231'
;WITH dates AS (
SELECT @START_DATE Date
UNION ALL
SELECT Date + 1
FROM CTE_DATES
WHERE Date + 1 < @ENDDATE
),
companies AS (
SELECT DISTINCT CompanyId
FROM yourTable
)
SELECT c.CompanyId, CAST(d.Date AS Date) Date
FROM companies c
CROSS JOIN dates d
LEFT JOIN yourTable t
ON c.CompanyId = t.CompanyId AND d.Date = t.Date
WHERE
t.CompanyId IS NULL
ORDER BY
c.CompanyId, d.Date;
【讨论】:
【参考方案3】:如果您只在表格中查找日期,我会选择:
select c.companyId, d.date
from (select distinct companyId from t) c cross join
(select distinct date from t) d left join
t
on t.companyId = c.companyId and t.date = d.date
where t.companyId is null
order by c.companyId, d.date;
这个想法很简单。 cross join
在表中创建公司和日期的所有组合。 left join
/where
过滤掉存在的那些。请注意缺少select distinct
。这不是必需的,只会减慢查询速度。
如果您正在寻找一系列日期,无论它们是否在表中,那么日历表 - ala Tim 的答案 - 是正确的方法。
【讨论】:
以上是关于如何获取公司未在 Sql 中记录的每个公司的日期?的主要内容,如果未能解决你的问题,请参考以下文章