Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL事件日历_Sql_Sql Server - Fatal编程技术网

SQL事件日历

SQL事件日历,sql,sql-server,Sql,Sql Server,我有一个我正试图用SQL创建的事件日历。问题是我不能像处理日期那样透视事件。有没有办法做两个支点或类似的事情,以便事件在日期下排列 这是枢轴前的桌子 YearNum MonthName week_number DayNum DayofWeek EventStart EventSubject EventLocation EventDate 2018 August 33 14 Tuesday NULL NULL

我有一个我正试图用SQL创建的事件日历。问题是我不能像处理日期那样透视事件。有没有办法做两个支点或类似的事情,以便事件在日期下排列

这是枢轴前的桌子

YearNum MonthName   week_number DayNum  DayofWeek   EventStart  EventSubject    EventLocation   EventDate
2018    August                  33  14  Tuesday         NULL    NULL    NULL    NULL
2018    August                  33  15  Wednesday       NULL    NULL    NULL    NULL
2018    August                  33  16  Thursday        13:00   Dan's Birthday  EC-E    2018-08-16
2018    August                  33  17  Friday          NULL    NULL    NULL    NULL
2018    August                  33  18  Saturday        NULL    NULL    NULL    NULL
2018    August                  34  19  Sunday          NULL    NULL    NULL    NULL
2018    August                  34  20  Monday          NULL    NULL    NULL    NULL
在枢轴之后,这就是它的外观

以下是我目前正在处理的SQL查询:

SELECT MonthName, YearNum, Sunday, Monday,Tuesday,Wednesday,Thursday,Friday,Saturday, EventStart, EventSubject, EventLocation, EventDate
FROM 
(
SELECT        CalendarDates.YearNum, CalendarDates.MonthName, DATEPART(WEEK, CalendarDates.StandardDate) AS week_number, CalendarDates.DayNum, 
                         CalendarDates.DayofWeek, EventList.EventStart, EventList.EventSubject, EventList.EventLocation, EventList.EventDate
FROM            (SELECT        EventStart, EventSubject, EventLocation, EventDate
                          FROM            EventList AS EventList_1) AS EventList RIGHT OUTER JOIN
                         CalendarDates ON EventList.EventDate = CalendarDates.StandardDate
WHERE        (CalendarDates.MonthNum = '8') AND (CalendarDates.YearNum = '2018')
)
pivotDates
PIVOT (MIN(DayNum) FOR DayofWeek IN (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday)) AS Pivots
这就是输出的样子

这个问题可以在表示层得到更好的解决,因为SQL在计算/过滤数据方面做得很好,但在用户界面上做得不好

无论如何,试试这个:

DECLARE @CurrentMonth   INT = 8,
        @CurrentYear    INT = 2018

;WITH   RawData AS  -- Your original appointment dates
(
        SELECT  CAST('2018-08-16' AS DATE)  Date, 
                CAST('13:00'      AS TIME)  Start, 
                'Someone birthday'          Subject, 
                'Location'                  Location 
),      AllMonthDays AS -- list of all days in the filtered month
(
        SELECT  CAST(CAST(@CurrentYear  AS VARCHAR) + '-' + 
                     CAST(@CurrentMonth AS VARCHAR) + '-01' AS DATE) Date UNION ALL
        SELECT  DATEADD(D, +1, Date)
        FROM    AllMonthDays
        WHERE   MONTH(DATEADD(D, +1, Date)) = @CurrentMonth
),      CalendarData AS -- Adds the weekday name, week numbering and appointment data
(
        SELECT      AllMonthDays.Date,
                    DATEPART(WEEK   , AllMonthDays.Date) WeekNumber,
                    DATENAME(DW     , AllMonthDays.Date) WeekdayName,
                    NULLIF(CONCAT(
                        CAST(RawData.Start AS CHAR(5)), ' ', 
                        RawData.Subject, '@ ', RawData.Location), ' @ ') Appointment
        FROM        AllMonthDays
        LEFT JOIN   RawData
                ON  RawData.Date = AllMonthDays.Date
),      CalendarFormat AS   -- PIVOT the data, putting the weekdays as columns
(
        SELECT  *
        FROM    CalendarData 
        PIVOT
        (   --MIN(Date) FOR         -- uncomment this to a better understanding
            MIN(Appointment) FOR    -- weird part: using MIN in a text column
            WeekdayName IN
            (   [Sunday], [Monday], [Tuesday],
                [Wednesday], [Thursday], [Friday], [Saturday]
            )
        ) p
)
SELECT      MIN(WeekNumber ) [WeekNumber],
            MIN([Sunday]   ) [Sunday], 
            MIN([Monday]   ) [Monday], 
            MIN([Tuesday]  ) [Tuesday], 
            MIN([Wednesday]) [Wednesday], 
            MIN([Thursday] ) [Thursday], 
            MIN([Friday]   ) [Friday], 
            MIN([Saturday] ) [Saturday]
FROM        CalendarFormat
GROUP BY    WeekNumber  -- suppress duplications
ORDER BY    WeekNumber

预期的输出是什么?轴心是现在的样子还是你想要的样子?如果一周内发生多个事件会发生什么?不要将图像、样本数据和预期结果作为文本发布。如果你真的想一劳永逸,就以CREATE和INSERT语句的形式发布你的示例数据。轴心是它现在的样子。最终结果将是日历上日期内的事件。日历上日期内的事件可能意味着任何事情。将所需结果集粘贴到问题中。