首页 > 解决方案 > T SQL查询格式构建动态表

问题描述

我需要帮助来创建查询以生成我正在寻找的结果。

我正在创建一个应用程序来根据现有数据库表跟踪员工出勤率。用户从日历中选择一个日期或一组日期(例如10/1/18,10/2/1810/3/18)。他们单击提交,我需要生成一个表格,如果他们当天在场,则在日期列中显示每个员工并带有复选标记。

该表名为 History,有 2 个主要列:EmployeeID;和交易日期。每次员工走过一扇门(包括入口)时,都会创建一个历史交易(NFC 徽章),该交易会添加一个带有员工 ID 和日期/时间戳的新行。每个员工每天可能有几次滑动,但我真正需要知道的是那天是否有一次滑动。我正在发布表格的外观以及查询结果和我的表格需要看起来的图片......

桌子: 在此处输入图像描述

结果: 在此处输入图像描述

我可以做如下查询:

select employeeid, TranDate from History 
where (CAST(trandate as DATE) = '2018-10-1' or CAST(trandate as DATE) = '2018-10-2' or CAST(trandate as DATE) = '2018-10-3' ) 
order by employeeid, TranDate

并以编程方式对其进行排序,但我觉得有一种更有效的方式来查询我正在寻找的结果。

任何帮助是极大的赞赏。如果我需要给出更好的解释,请告诉我。

标签: sqlsql-serversql-server-2008sql-server-2012

解决方案


你想要做的叫做pivot

尝试使用此代码

SELECT employeeid
      ,case when [2018-10-1] > 0 then '1' else '' end as [2018-10-1]
      ,case when [2018-10-2] > 0 then '1' else '' end as [2018-10-2]
      ,case when [2018-10-3] > 0 then '1' else '' end as [2018-10-3]
FROM(
SELECT employeeid
     , TranDate
     , 1 as num 
FROM History 
WHERE (CAST(trandate as DATE) = '2018-10-1' 
       or CAST(trandate as DATE) = '2018-10-2' 
       or CAST(trandate as DATE) = '2018-10-3' ) 
)
PIVOT(
COUNT(num)
FOR TranDate IN ([2018-10-1],[2018-10-2],[2018-10-3])
) as pvt

您可以在PIVOT、UNPIVOT SQL上查看 PIVOT 和 UNPIVOT 上的 sql 文档,此外,如果您想要为您的转换字段提供更多动态,您可以查看Dynamic Pivot


推荐阅读