2014-10-20 32 views
0

您可以请协助分割日期结果集到sql server中的列

我有一个查询,显示教师的数量,访问的网站以及他们访问的日期。该查询查看过去一周的所有教师访问情况。

我想将dateattended字段拆分为列以显示过去一周的每日访问。下面是它的外观。

EmployeeNumber Name     HomeSite Site Attended Day Attended 
TP-000322789 Samuel Mohlamnyane Teacher   Port Elizabeth 2014-10-18 07:23 
TP-000148774 Jean Smoothie   Teacher  Hennopsview 2014-10-13 08:55 
TP-000148774 Jean Smoothie   Teacher  Hennopsview 2014-10-16 08:43 
TP-000148122 Anthony Mike   Teacher  Tzaneen  2014-10-19 09:19 
TP-000148122 Anthony Mike   Teacher  Tzaneen  2014-10-15 08:26 
TP-000328452 Geneve Gorridon   Teacher  Tzaneen  2014-10-14 07:44 
TP-000346529 Edmos Dube    Teacher  Melrose  2014-10-18 07:47 
TP-000321374 Anita Rene Classen  Teacher  Johannesburg 2014-10-17 07:57 
TP-000324511 Anthonysia White  Teacher  Durbanville 2014-10-15 07:53 
TP-000324511 Anthonysia White  Teacher  Durbanville 2014-10-18 12:26 
TP-000327471 Moses Mathebula   Teacher  Polokwane  2014-10-13 05:50 
TP-000148194 Nonhlanhla Ndlovu  Teacher  Vereeniging 2014-10-15 07:06 
TP-000323383 Lerato Manyanka   Teacher  Bedfordview 2014-10-13 07:26 
TP-000323383 Lerato Manyanka   Teacher  Bedfordview 2014-10-16 06:51 
TP-000323384 Lerato Manyanka   Teacher  Bedfordview 2014-10-17 08:57 

现在我想拆分日出席日期不同列从昨天走到过去七天。

下面是我用来获得上述结果集的代码。结果应该如何。

EmployeeNumber Name    HomeSite Site Attended Day 1 Day2 Day 3    Day 4    Day 5    Day 6   Day 7 
TP-000148194 Nonhlanhla Ndlovu Teacher Vereeniging              2014-10-15 07:06 
TP-000323383 Lerato Manyanka Teacher Bedfordview     2014-10-17 08:57 2014-10-16 06:51          2014-10-13 07:26 



SELECT mdet.MemRefNo      AS 'EmployeeNumber' 
     , cont.FirstName + ' ' + cont.LastName AS Name 
     , s.Name        AS 'HomeSite' 
     , Attend.VisitedSite     AS 'Site Attended' 
     , Attend.Weekdays      AS 'Day Attended' 

FROM MemberDetail mdet 
INNER JOIN MembershipHistory mhis ON mdet.CurrentMembershipID = mhis.ID32 
INNER JOIN contacts cont ON cont.GUID = mdet.ContactGUID 
INNER JOIN Sites s ON s.id = cont.HomeSiteID 

INNER JOIN Packages pg ON pg.ID = mhis.PackageID 


CROSS APPLY 
(
SELECT min(a1.attenddate) AS Weekdays , a1.contactguid, a1.SiteID , s.Name as VisitedSite  FROM dbo.attendance a1 
    INNER JOIN Sites s ON s.id = a1.Siteid 
WHERE DATEDIFF(DAY,a1.attenddate,GETDATE()) <= 7 
and ContactGuid = mdet.ContactGuid 
AND a1.isswipesuccessful = 1 
GROUP BY a1.ContactGuid, DATEPART(DW, a1.attenddate),a1.SiteID , s.Name 
) Attend 

WHERE pg.Description LIKE '%Teacher%' 
+0

您可以编辑的问题增加的新列应该是什么样子的例子吗? – acfrancis 2014-10-20 15:10:45

+0

嗨,我已编辑上述查询,以显示这应该看起来如何 – user1538257 2014-10-21 06:29:39

+0

好,所以你已经写了一个选择。它产生你想要的结果吗?它靠近吗? – acfrancis 2014-10-21 09:11:15

回答

0

我想这是你想要的查询,它使用与现有查询作为源通过一个共同的表表达式的结果的支点。理想情况下,代码可以合并到一个查询中,但由于您没有提供源表中的任何测试数据,但只有输出我没有尝试重写它。请注意,如果一个人在一天内多次访问同一个网站,则只会显示最近的时间。

-- using original query as source 
;WITH visits AS (
    SELECT mdet.MemRefNo      AS 'EmployeeNumber' 
     , cont.FirstName + ' ' + cont.LastName AS Name 
     , s.Name        AS 'HomeSite' 
     , Attend.VisitedSite     AS 'Site Attended' 
     , Attend.Weekdays      AS 'Day Attended' 

    FROM MemberDetail mdet 
    INNER JOIN MembershipHistory mhis ON mdet.CurrentMembershipID = mhis.ID32 
    INNER JOIN contacts cont ON cont.GUID = mdet.ContactGUID 
    INNER JOIN Sites s ON s.id = cont.HomeSiteID 
    INNER JOIN Packages pg ON pg.ID = mhis.PackageID 
    CROSS APPLY 
    (
    SELECT min(a1.attenddate) AS Weekdays , a1.contactguid, a1.SiteID , s.Name as VisitedSite  FROM dbo.attendance a1 
     INNER JOIN Sites s ON s.id = a1.Siteid 
    WHERE DATEDIFF(DAY,a1.attenddate,GETDATE()) <= 7 
    and ContactGuid = mdet.ContactGuid 
    AND a1.isswipesuccessful = 1 
    GROUP BY a1.ContactGuid, DATEPART(DW, a1.attenddate),a1.SiteID , s.Name 
    ) Attend 
    WHERE pg.Description LIKE '%Teacher%' 
) 

-- query to produce results 
SELECT 
    EmployeeNumber, 
    Name, 
    HomeSite, 
    [Site Attended], 
    [1] AS 'Day 1', 
    [2] AS 'Day 2', 
    [3] AS 'Day 3', 
    [4] AS 'Day 4', 
    [5] AS 'Day 5', 
    [6] AS 'Day 6', 
    [7] AS 'Day 7' 
FROM (
    SELECT *, DATEDIFF(day, [Day Attended], GETDATE()) diff 
    FROM visits 
    WHERE [Day Attended] > (GETDATE()-7) -- adjust this to limit date range 
    ) a 
PIVOT (
    MAX([Day Attended]) FOR [diff] in ([1],[2],[3],[4],[5],[6],[7]) 
) AS Pivoted; 

修改现有查询以获得所需结果可能微不足道。

Sample SQL Fiddle(使用样本输出数据作为源)。

样品结果:

EmployeeNumber  Name          HomeSite    Site Attended  Day 1     Day 2     Day 3     Day 4     Day 5     Day 6     Day 7 
-------------------- ---------------------------------------- -------------------- -------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- 
TP-000148122   Anthony Mike        Teacher    Tzaneen    NULL     2014-10-19 09:19:00.000 NULL     NULL     NULL     2014-10-15 08:26:00.000 NULL 
TP-000148194   Nonhlanhla Ndlovu      Teacher    Vereeniging   NULL     NULL     NULL     NULL     NULL     2014-10-15 07:06:00.000 NULL 
TP-000148774   Jean Smoothie       Teacher    Hennopsview   NULL     NULL     NULL     NULL     2014-10-16 08:43:00.000 NULL     NULL 
TP-000321374   Anita Rene Classen      Teacher    Johannesburg   NULL     NULL     NULL     2014-10-17 07:57:00.000 NULL     NULL     NULL 
TP-000322789   Samuel Mohlamnyane      Teacher    Port Elizabeth  NULL     NULL     2014-10-18 07:23:00.000 NULL     NULL     NULL     NULL 
TP-000323383   Lerato Manyanka       Teacher    Bedfordview   NULL     NULL     NULL     2014-10-17 08:57:00.000 2014-10-16 06:51:00.000 NULL     NULL 
TP-000324511   Anthonysia White       Teacher    Durbanville   NULL     NULL     2014-10-18 12:26:00.000 NULL     NULL     2014-10-15 07:53:00.000 NULL 
TP-000346529   Edmos Dube        Teacher    Melrose    NULL     NULL     2014-10-18 07:47:00.000 NULL     NULL     NULL     NULL 
+0

嗨jpw,非常感谢你指点我正确的方向。除了您提供的解决方案之外,您在限制日期范围内使用的过滤器。 “WHERE [Day Attended>(GETDATE() - 7)”您可以在系统时间(运行查询的时间)的同一时间过滤以查看所有出席情况(大于7天后)。为确保当天包括所有时间,我们可以用“DATEADD(d,-7,DATEDIFF(d,0,GETDATE()))”替换“getdate() - 7”。毫无疑问,这是我正在寻找的。谢谢 – user1538257 2014-10-21 10:38:00

+0

@ user1538257事实上,'DATEADD(d,-7,DATEDIFF(d,0,GETDATE()))'会更好。我的答案是否解决了您的问题? – jpw 2014-10-21 10:42:51

+0

哦,是的,你绝对回答我的问题。就像现在补充说的,我希望我的别名从Day1,Day2等发生变化,然后添加一个类似Day1(20-10-2014),Day2(19-10-2014)的通用日期,如果您有线索我如何能做到这一点,我真的很感激它。 – user1538257 2014-10-21 11:04:25