【问题标题】:sql server pivot table querysql server 数据透视表查询
【发布时间】:2019-07-22 07:13:28
【问题描述】:

我们正在尝试将考勤日志数据转换为数据透视表。为简单起见,实际数据格式为:

EmployeeId, InOrOut,  DateTime
1            0        2019-01-01 08:00:00
1            1        2019-01-01 17:00:00
1            0        2019-01-02 08:00:00
1            1        2019-01-02 17:00:00
2            0        2019-01-01 08:00:00
2            1        2019-01-01 17:00:00

我们需要这样:

EmployeeId, Date,        InTime , OutTime
1           2019-01-01   08:00    17:00
1           2019-01-02   08:00    17:00
2           2019-01-01   08:00    17:00

但是我们所做的查询似乎不是这样工作的。查询如下:

SELECT * FROM
(
SELECT aml.EnrollNumber, aml.A_Date, aml.InOutMode, aml.A_Time
 FROM dbo.Attendence_Machines_LOG aml) AS AttendanceTable
PIVOT (
     max(A_Date)
    FOR InOutMode in ([1],[0])
) as PivotTable

关于pivot有很多困惑,个人找不到太多教程。

我们如何告诉查询将数据放在新行中的依据(例如,在这种情况下,我们将如何告诉查询根据日期和员工ID分隔记录)

任何帮助表示赞赏

【问题讨论】:

  • 您能发布示例数据和所需的输出吗?
  • 当然.. 已添加 2 个示例 :)
  • 它不是一个支点。 Pivot 意味着将行数据转换为列名。 @Yogesh Sharma 给你一个很好的答案。赞成。
  • 我认为您需要首先获取每个日期的所有时间记录,然后将每个日期的第一条记录显示为“in”,将最后一条记录显示为“out”。

标签: sql sql-server tsql pivot


【解决方案1】:

你可以做聚合:

SELECT aml.EnrollNumber, aml.A_Date,
       MAX(CASE WHEN aml.InOutMode = 1 THEN aml.A_Time END),
       MAX(CASE WHEN aml.InOutMode = 0 THEN aml.A_Time END)
FROM dbo.Attendence_Machines_LOG AS aml
GROUP BY aml.EnrollNumber, aml.A_Date;

编辑:问题编辑后:

SELECT aml.EnrollNumber, CAST(aml.A_Date AS DATE),
       MAX(CASE WHEN aml.InOutMode = 1 THEN aml.A_Time END),
       MAX(CASE WHEN aml.InOutMode = 0 THEN aml.A_Time END)
FROM dbo.Attendence_Machines_LOG AS aml
GROUP BY aml.EnrollNumber, CAST(aml.A_Date AS DATE);

【讨论】:

  • 感谢您的回答。也会尝试的。然而也只是好奇地抓住机会并学习如何做数据透视表:)
【解决方案2】:

如果你想要这是支点,那么试试这个:

    GO
    create table #temptable ( empid int, inorout int, attdate datetime )
    Go

    insert into #temptable ( empid, inorout, attdate )
    values ( 1 ,           0        ,'2019-01-01 08:00:00'),
    (1            ,1        ,'2019-01-01 17:00:00')
    ,(1            ,0        ,'2019-01-02 08:00:00')
    ,(1            ,1        ,'2019-01-02 17:00:00')
    ,(2            ,0        ,'2019-01-01 08:00:00')
    ,(2            ,1        ,'2019-01-01 17:00:00')


    select * from #temptable

    select empid, atdate, [0], [1]  from (
    select empid,inorout,  CAST(attdate as DATE) as atdate, attdate from #temptable ) as d
    pivot 
    ( max(attdate) for inorout in ( [0], [1] )
    ) as pv

    go

    drop table #temptable

如果有任何困惑,请随时询问。

注意:但这只有在您每天只有 1 In 和 1 Out 作为给定的原始数据时才有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多