在日期列上旋转所有时间数据

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 将不胜感激。

我认为,您可以从 Efficiently convert rows to columns in sql server

答案如下:

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 列,它在每个 TDateCNum 中为每一行提供了唯一的编号。我们将其添加到矩阵中的 CNu 组(因此它按 CNu 分组,然后按 RowN 分组)

这是包含行组和列组的最终设计(列组仅按 TDate)

为了获得第 2 行,我右键单击 [TimeIn] 'cell' 并执行 "Insert Row = > Inside Group - Below"

最终输出如下所示