将多个日期字段加入日历 table
Joining multiple date fields to calendar table
我有一个table,我们称它为记录,相关数据组织如下:
| 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 的日历 table,其中包含一个名为 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
我不确定如何加入。我已经阅读了很多关于日历 tables 的资源,但示例总是包括加入每个具有单个日期标识符的 tables。我的问题是我有一个 table 和三个需要与 Calendar.TheDate.
关联的日期字段
我正在这样安排我的数据,以便可以在 Qlik Sense 中可视化数据。我希望用户能够从过滤器面板 select TheDate 并让它聚合指定日期的所有三个字段(与我的示例代码中的 WHERE 子句基本相同)。
这应该可行 - 我已经为示例数据包含了一些简单的 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
试试下面的代码
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 服务器早于 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
我有一个table,我们称它为记录,相关数据组织如下:
| 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 的日历 table,其中包含一个名为 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
我不确定如何加入。我已经阅读了很多关于日历 tables 的资源,但示例总是包括加入每个具有单个日期标识符的 tables。我的问题是我有一个 table 和三个需要与 Calendar.TheDate.
关联的日期字段我正在这样安排我的数据,以便可以在 Qlik Sense 中可视化数据。我希望用户能够从过滤器面板 select TheDate 并让它聚合指定日期的所有三个字段(与我的示例代码中的 WHERE 子句基本相同)。
这应该可行 - 我已经为示例数据包含了一些简单的 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
试试下面的代码
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 服务器早于 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