【问题标题】:Joining multiple date fields to calendar table将多个日期字段加入日历表
【发布时间】:2018-03-23 16:10:28
【问题描述】:

我有一个表,我们称之为记录,其中相关数据是这样组织的:

| Employee | SubmissionDate | FirstReviewDate | SecondReviewDate |
  Anne       2017-10-02       2017-10-03        2017-10-10          
  Bernard    2017-10-03       2017-10-05        2017-10-10
  Charlene   2017-10-06       2017-10-09        2017-10-09
  Danielle   2017-10-02       2017-10-03        2017-10-09
  Anne       2017-10-03       2017-10-03        2017-10-09

员工每次提交时,都会添加一个带有 SubmissionDate 的新条目。该记录稍后被编辑以包含然后进行第一次和第二次审查。

我还有一个名为 Calendar 的日历表,其中包含一个名为 TheDate 的字段,其中包含今年每一天的日期。我想做的是将 SubmissionDate、FirstReviewDate 和 SecondReview 日期与 Calendar.TheDate 相关联,这样我就可以对任何给定日期的所有三个字段进行计数。

我已经尝试了以下代码:

SELECT Employee,
       Count(SubmissionDate) AS "Submissions",
       Count(FirstReviewDate) AS "First Reviews",
       Count(SecondReviewDate) AS "Second Reviews"
  FROM Records
  LEFT JOIN Calendar ON Records.SubmissionDate = Calendar.TheDate
   AND Records.FirstReviewDate = Calendar.TheDate
   AND Records.SecondReviewDate = Calendar.TheDate
 WHERE TheDate = '2017-10-11'

我尝试过的所有变体都没有输出:

| Employee | Submissions | First Reviews | Second Reviews |

我想要的代码如下所示:

SELECT Employee,
       Count(SubmissionDate),
       Count(FirstReviewDate),
       Count(SecondReviewDate)
  FROM ???
 WHERE TheDate = '2017-10-03'

在哪里???将是正确的加入。使用所需的代码块(包括 where 子句),对于提供的示例数据,所需的输出将如下所示:

| Employee | Submissions | First Reviews | Second Reviews |
  Anne       1             2               0
  Bernard    1             0               0
  Charlene   0             0               0
  Danielle   0             1               0

我不知道如何加入。我已经阅读了许多有关日历表的资源,但这些示例始终包括连接表,每个表都有一个日期标识符。我的问题是我有一张表,其中包含三个需要与 Calendar.TheDate 关联的日期字段。

我正在这样排列我的数据,以便可以在 Qlik Sense 中可视化数据。我希望用户能够从过滤器面板中选择 TheDate 并让它聚合指定日期的所有三个字段(基本上与我的示例代码中的 WHERE 子句相同)。

【问题讨论】:

  • 如果您显示示例数据和结果会有所帮助。
  • 我的示例数据在顶部,我提到它没有输出。我将尝试编辑帖子以使其更清楚。
  • 将需要看到所需的结果,而不是基于您尝试过的结果。
  • 我已经更新了我的原始帖子以包含更多示例数据以及所需的输出。我道歉;我回复后才知道你在问什么。让我知道是否还有其他可以添加的内容。
  • 根据期望的结果和原始数据......你是怎么想出 Anne 有 2 个第一次审查日期的?

标签: sql-server tsql join calendar qliksense


【解决方案1】:

试试下面的代码

create table #recs (
  Employee varchar(10), 
  SubmissionDate date, 
  FirstReviewDate date, 
  SecondReviewDate date
)

insert into #recs values
('Anne',       '2017-10-02', '2017-10-03', '2017-10-10'),          
('Bernard',    '2017-10-03', '2017-10-05', '2017-10-10'),
('Charlene',   '2017-10-06', '2017-10-09', '2017-10-09'),
('Danielle',   '2017-10-02', '2017-10-03', '2017-10-09'),
('Anne',       '2017-10-03', '2017-10-03', '2017-10-09')

select Employee
    , sum(IIF(SubD.Date_Value = #recs.SubmissionDate, 1, 0)) AS Submissions 
    , sum(IIF(SubD.Date_Value = #recs.FirstReviewDate, 1, 0)) AS [First Reviews]
    , sum(IIF(SubD.Date_Value = #recs.SecondReviewDate, 1, 0)) AS [Second Reviews]
from #recs
    left join DimDate SubD on SubD.Date_Value = '2017-10-03' and
        (SubD.Date_Value = #recs.SubmissionDate
        or SubD.Date_Value = #recs.FirstReviewDate
        or SubD.Date_Value = #recs.SecondReviewDate)
group by Employee

如果您的 SQL Server 早于 2012,请使用 CASE 而不是 IIF

select Employee
    , sum(case when SubD.Date_Value = #recs.SubmissionDate then 1 else 0 end) AS Submissions 
    , sum(case when SubD.Date_Value = #recs.FirstReviewDate then 1 else 0 end) AS [First Reviews]
    , sum(case when SubD.Date_Value = #recs.SecondReviewDate then 1 else 0 end) AS [Second Reviews]
from #recs
    left join DimDate SubD on SubD.Date_Value = '2017-10-03' and
        (SubD.Date_Value = #recs.SubmissionDate
        or SubD.Date_Value = #recs.FirstReviewDate
        or SubD.Date_Value = #recs.SecondReviewDate)
group by Employee

【讨论】:

  • 再次感谢;我已将您的回复标记为答案。
【解决方案2】:

这应该可行 - 我已经为示例数据包含了一些简单的 DML:-

--Table Setup
IF OBJECT_ID('Records') IS NOT NULL
  DROP TABLE Records;
IF OBJECT_ID('Calendar') IS NOT NULL
  DROP TABLE Calendar;

CREATE TABLE Records (
  Employee varchar(100),
  SubmissionDate datetime,
  FirstReviewDate datetime,
  SecondReviewDate datetime
)


CREATE TABLE Calendar (
  TheDate datetime
)

INSERT Records
  VALUES ('Anne', '2017-10-02', '2017-10-03', '2017-10-10'),
  ('Bernard', '2017-10-03', '2017-10-05', '2017-10-10'),
  ('Charlene', '2017-10-06', '2017-10-09', '2017-10-09'),
  ('Danielle', '2017-10-02', '2017-10-03', '2017-10-09'),
  ('Anne', '2017-10-03', '2017-10-03', '2017-10-09')


INSERT Calendar
  VALUES ('2017-10-03'), ('2017-10-04'), ('2017-10-05')



--Main Query
DECLARE @TheDate datetime = '2017-10-03'

SELECT
  Employee,
  SUM(CASE
    WHEN c1.TheDate IS NOT NULL THEN 1
    ELSE 0
  END),
  SUM(CASE
    WHEN c2.TheDate IS NOT NULL THEN 1
    ELSE 0
  END),
  SUM(CASE
    WHEN c3.TheDate IS NOT NULL THEN 1
    ELSE 0
  END)
FROM Records r
LEFT JOIN Calendar c1
  ON r.SubmissionDate = c1.TheDate
  AND c1.thedate = @TheDate
LEFT JOIN Calendar c2
  ON r.FirstReviewDate = c2.TheDate
  AND c2.thedate = @TheDate
LEFT JOIN Calendar c3
  ON r.SecondReviewDate = c3.TheDate
  AND c3.thedate = @TheDate
GROUP BY Employee

【讨论】:

  • 此代码符合我的规范。非常感谢您的回复,我已对回复投了赞成票(尽管它不是公开可见的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多