mysql 需要以日期为列的SQL Server动态数据透视表

50few1ms  于 2022-12-10  发布在  Mysql
关注(0)|答案(1)|浏览(155)

我搜索了这个论坛和其他论坛,仍然找不到一个有效的解决方案。我在MS SQL中有一个Employees表和一个EmpCalendar表。表格数据如下所示,当然是为本论坛简化的;
雇员表
User_id|员工

1|Crystal Dee
4|Darryl Haster
EmpCalendar表
Calid|user_id|Date_Assigned|Position|StartTime-EndTime
-|
1|1|2202-11-29|LPN|上午7:00-下午2:30
2|4|2202-11-29|RN|
3|1|2202-11-30|LPN|
4|4|2202-11-30|主播|上午7:00-下午3:30
正如您可以看到的,每天有多个人工作,所以每天都有许多条目,我在SQL中所做的基本输出(对于给定的日期范围)将类似于上面的EmpCalendar表,其中包含Employees表中的员工姓名(涉及内部联接和SQL,因为我也不想向任何人显示当天的休息时间,等等)。我们的调度程序需要一次大约一周的概览来查看有哪些空位,因此日期应该以列的形式进行,而不是像EmpCalendar表中那样以行的形式输出。所需输出将如下所示:
职位|员工|2202-11-29|2202-11-30
-|-|
LPN|Crystal Dee|上午7:00-下午2:30|上午7:00-下午2:30
RN|Darryl Haster||上午7:00-下午3:30
LPN|Crystal Dee|上午7:00-下午2:30|
RN|Darryl Haster|上午7:00-下午3:30|上午7:00-下午3:30
我在我的SQL语句中尝试了透视查询,但遇到了错误,并多次尝试查找与我类似的问题,然后更改我的特定表的答案,但我的问题涉及日期,而不仅仅是nvarchar条目(大多数示例都涉及nvarchar条目),但它们是SQL中的日期条目。我以前从来没有在SQL中做过透视,直到最近才了解到它们存在于研究为什么我不能根据需要获得作为列的日期的输出,并且通常操作我的Coldfusion代码中的数据。以下是我当前的SQL查询示例,用于获取从CF表单到此页面的特定日期范围的日历条目列表:

SELECT  EmpCalendar.position, EmpCalendar.Days_date
, EmpCalendar.Shift, EmpCalendar.UnitWorking, EmpCalendar.StartTime
, EmpCalendar.EndTime, EmpCalendar.HoursWorked, pCalendar.CountOfHours
, EmpCalendar.user_id, EmpCalendar.Comments, Employees.fullname
, Employees.FirstName, Employees.LastInit

FROM EmpCalendar INNER JOIN Employees ON EmpCalendar.user_id = Employees.user_id

  where (LEN(EmpCalendar.Off_type) < 1 or EmpCalendar.Off_type IS NULL)           

  and EmpCalendar.Days_date >= #Startdate#  
  and EmpCalendar.Days_date <= #Enddate# and EmpCalendar.Shift = '1' 

  order by Days_date
djmepvbi

djmepvbi1#

我认为你所要求的精神与你想要的略有不同,所以如果这个解决方案不适合你的情况,我深表歉意。同样有趣的是,您的标记似乎是针对MySQL的,但您的问题是MS SQL。我假设它是为MS SQL设计的。

-- Using Common Table Expressions just to allow me to reproduce data set locally
;WITH CTE_Employees AS (
    SELECT *
    FROM (
            VALUES (1,'Crystal Dee'),
                (4,'Darryl Haster')
        ) AS a([user_id],Employee)
),
CTE_EmpCalendar AS (
    SELECT *
    FROM (
        VALUES (1,1,'2022-11-29','LPN','07:00-14:30'),
        (2,4,'2022-11-29','RN',NULL),
        (3,1,'2022-11-30','LPN',NULL),
        (4,4,'2022-11-30','RN','07:00-15:30')
    ) AS a(CalId,[User_id],Date_Assigned,Position,ShiftTimes)
)

SELECT Position,
    Employee,
    Pivoted.*
FROM (
    SELECT b.Position,
        a.Employee,
        b.ShiftTimes,
        b.Date_Assigned
    FROM CTE_Employees AS a

        INNER JOIN CTE_EmpCalendar AS b
        ON a.[user_id] = b.[User_id]
) AS SourceData
PIVOT (
        MAX(ShiftTimes)
        FOR Date_Assigned IN (
            [2022-11-29],
            [2022-11-30],
            [2022-12-01] -- This is for a pretend scenario in which CF has generated the range of dates throughout the week
    )
) AS Pivoted

我看到你也提到了冷聚变。我假设您已经知道了报表的开始日期和结束日期,并且可以动态循环cfQuery标记以生成将出现在for DATE_ASSIGNED IN(...Cf此处循环...)密码。
只有一些其他的小纸币。我预计开始时间和结束时间应该在单独的时间数据类型d列中。你在2202年的产出中的日期,可能是2022年,只是值得注意的是,当你进一步深入项目时,这会引起你的问题。
相关文档:https://learn.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver16
希望这能帮上忙。祝好运!

相关问题