在日期列上旋转所有时间数据
Pivot all Time Data on Date Column
我需要在 SQL 服务器报告服务中创建报告。源 table/query 数据的结构如下:
CNum | EmpNo | TDate | TimeIn | TimeOut
100 | 2 | 12/4/2019 | 7:00 AM | 12:00 PM
100 | 2 | 12/4/2019 | 12:30 PM | 3:30 PM
100 | 2 | 12/5/2019 | 7:00 AM | 12:00 PM
100 | 2 | 12/5/2019 | 12:30 PM | 3:30 PM
我需要报告输出显示如下(或类似的东西,只需要将 TDate 显示为列,将基于 Cnum 的任何相关时间条目显示为行)。
CNum | 12/4/2019 | 12/5/2019 |
100 | 7:00 AM | 7:00 AM |
| 12:00 PM | 12:00 PM |
100 | 12:30 PM | 12:30 PM |
| 3:30 PM | 3:30 PM |
我曾尝试使用 Matrix Tablix,但这会迫使小组每天只能记录 return,而实际上可能有多个记录。我的目标是编写一个 SQL 查询(CTE 或 PIVOT),它将以正确的格式给我报告数据,这样我就不必在报告设计器中发疯了。
我熟悉 SQL 但由于某种原因,我无法获得任何查询以输出 (Pivot) 并包括当天的两条记录。
任何 help/guidance 将不胜感激。
答案如下:
With CTE as (
Select
CNum,
TDate,
TimeIn as [Time],
'In' as [Action]
From TimeTable
Union All
Select
CNum,
TDate,
[TimeOut] as [Time],
'Out' as [Action]
From TimeTable
)
Select
*
From CTE
Pivot(min([Time]) for TDate in ([2019-12-04],[2019-12-05])) as pivot_table
union all
Select
*
From CTE
Pivot(max([Time]) for TDate in ([2019-12-04],[2019-12-05])) as pivot_table
您可以在 SSRS 中轻松完成此操作,只需对数据集查询进行少量更改。
我使用以下内容复制了您的样本数据
DECLARE @t TABLE(CNum int, EMpNo int, TDate Date, TimeIn Time, [Timeout] Time)
INSERT INTO @t VALUES
(100, 2, '2019/12/04', '07:00', '12:00'),
(100, 2, '2019/12/04', '12:30', '15:30'),
(100, 2, '2019/12/05', '07:00', '12:00'),
(100, 2, '2019/12/05', '12:30', '15:30')
SELECT *, ROW_NUMBER() OVER(PARTITION BY TDate, Cnum ORDER BY TimeIn) as RowN FROM @t
注意:我添加了 RowN
列,它在每个 TDate
和 CNum
中为每一行提供了唯一的编号。我们将其添加到矩阵中的 CNu 组(因此它按 CNu 分组,然后按 RowN 分组)
这是包含行组和列组的最终设计(列组仅按 TDate)
为了获得第 2 行,我右键单击 [TimeIn] 'cell' 并执行 "Insert Row = > Inside Group - Below"
最终输出如下所示
我需要在 SQL 服务器报告服务中创建报告。源 table/query 数据的结构如下:
CNum | EmpNo | TDate | TimeIn | TimeOut
100 | 2 | 12/4/2019 | 7:00 AM | 12:00 PM
100 | 2 | 12/4/2019 | 12:30 PM | 3:30 PM
100 | 2 | 12/5/2019 | 7:00 AM | 12:00 PM
100 | 2 | 12/5/2019 | 12:30 PM | 3:30 PM
我需要报告输出显示如下(或类似的东西,只需要将 TDate 显示为列,将基于 Cnum 的任何相关时间条目显示为行)。
CNum | 12/4/2019 | 12/5/2019 |
100 | 7:00 AM | 7:00 AM |
| 12:00 PM | 12:00 PM |
100 | 12:30 PM | 12:30 PM |
| 3:30 PM | 3:30 PM |
我曾尝试使用 Matrix Tablix,但这会迫使小组每天只能记录 return,而实际上可能有多个记录。我的目标是编写一个 SQL 查询(CTE 或 PIVOT),它将以正确的格式给我报告数据,这样我就不必在报告设计器中发疯了。
我熟悉 SQL 但由于某种原因,我无法获得任何查询以输出 (Pivot) 并包括当天的两条记录。
任何 help/guidance 将不胜感激。
答案如下:
With CTE as (
Select
CNum,
TDate,
TimeIn as [Time],
'In' as [Action]
From TimeTable
Union All
Select
CNum,
TDate,
[TimeOut] as [Time],
'Out' as [Action]
From TimeTable
)
Select
*
From CTE
Pivot(min([Time]) for TDate in ([2019-12-04],[2019-12-05])) as pivot_table
union all
Select
*
From CTE
Pivot(max([Time]) for TDate in ([2019-12-04],[2019-12-05])) as pivot_table
您可以在 SSRS 中轻松完成此操作,只需对数据集查询进行少量更改。
我使用以下内容复制了您的样本数据
DECLARE @t TABLE(CNum int, EMpNo int, TDate Date, TimeIn Time, [Timeout] Time)
INSERT INTO @t VALUES
(100, 2, '2019/12/04', '07:00', '12:00'),
(100, 2, '2019/12/04', '12:30', '15:30'),
(100, 2, '2019/12/05', '07:00', '12:00'),
(100, 2, '2019/12/05', '12:30', '15:30')
SELECT *, ROW_NUMBER() OVER(PARTITION BY TDate, Cnum ORDER BY TimeIn) as RowN FROM @t
注意:我添加了 RowN
列,它在每个 TDate
和 CNum
中为每一行提供了唯一的编号。我们将其添加到矩阵中的 CNu 组(因此它按 CNu 分组,然后按 RowN 分组)
这是包含行组和列组的最终设计(列组仅按 TDate)
为了获得第 2 行,我右键单击 [TimeIn] 'cell' 并执行 "Insert Row = > Inside Group - Below"
最终输出如下所示