【问题标题】:How To get Dates for each Company that company has not record In Sql?如何获取公司未在 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

【问题讨论】:

  • 您可能希望在此处使用日历表。

标签: sql sql-server tsql


【解决方案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 的答案 - 是正确的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多