CREATE TABLE A(
[Id] [int] IDENTITY(1,1) NOT NULL,
[WeekDay] [int] NOT NULL,
[CID] [int] NOT NULL,
[BID] [int] NOT NULL
)
CREATE TABLE B(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NOT NULL
)
CREATE TABLE C(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL
)
SELECT
NW.NAME ,
D.NAME AS PAIBAN ,
WEEKDAY
FROM
A N
JOIN B NW ON N.BID=NW.ID
JOIN C D ON N.CID=D.ID
ORDER BY
NW.NAME
执行完结果是:
Name paiban WeekDay
关羽 早班 1
关羽 晚班 2
居家护工2 早班 2
居家护工2 早班 6
居家护工2 中班 5
居家护工2 晚班 3
居家护工2 早班 1
居家护工2 中班 3
居家护工2 中班 6
陆勇 中班 6
陆勇 中班 1
陆勇 晚班 3
陆勇 早班 3
我想变成:
执行完结果是:
Name Monday Tuesday Wednesday Thursday Friday Saturday Sunday
关羽 早班 晚班
居家护工2 早班 早班 晚班/中班 中班 早班/中班
求大神指点!!!!!!!!!!!!!!
------解决思路----------------------
;with tb as
(
SELECT
NW.NAME ,
D.NAME AS PAIBAN ,
[WEEKDAY]
FROM A N
JOIN B NW ON N.BID=NW.ID
JOIN C D ON N.CID=D.ID
),
tb02 as
(
select
name, [WEEKDAY],
(
stuff((select N','+ PAIBAN
from tb
where Name=t.Name and [WEEKDAY]=t.[WEEKDAY]
and PAIBAN <> ''
order by [WeekDay] desc
FOR XML PATH('')), 1, 1, N'')
) as PAIBAN
from tb as t
group by name, [WEEKDAY]
)
select name,
isnull([1], '') as [Monday],
isnull([2], '') as [Tuesday],
isnull([3], '') as [Wednesday],
isnull([4], '') as [Thursday],
isnull([5], '') as [Friday],
isnull([6], '') as [Saturday],
isnull([7], '') as [Sunday]
from tb02
pivot
(
max(PAIBAN) for [WeekDay] in ([1], [2], [3], [4], [5], [6], [7])
) as T
------解决思路----------------------
WITH a ([Name],paiban,[WeekDay])AS(
/* 测试数据,换上你原先的查询
SELECT '关羽','早班',1 UNION ALL
SELECT '关羽','晚班',2 UNION ALL
SELECT '居家护工2','早班',2 UNION ALL
SELECT '居家护工2','早班',6 UNION ALL
SELECT '居家护工2','中班',5 UNION ALL
SELECT '居家护工2','晚班',3 UNION ALL
SELECT '居家护工2','早班',1 UNION ALL
SELECT '居家护工2','中班',3 UNION ALL
SELECT '居家护工2','中班',6
*/
)
,b AS (
SELECT [Name],[WeekDay],
CONVERT(nvarchar(10),
STUFF((SELECT ','+paiban
FROM a AS t2
WHERE t2.[Name] = t1.[Name]
AND t2.[WeekDay] = t1.[WeekDay]
FOR XML PATH('')
),
1,1,'')
) AS paiban
FROM (SELECT DISTINCT [Name],[WeekDay] FROM a) AS t1
)
SELECT [Name],
[1] AS Monday,
[2] AS Tuesday,
[3] AS Wednesday,
[4] AS Thursday,
[5] AS Friday,
[6] AS Saturday,
[7] AS Sunday
FROM b
PIVOT (
MAX(paiban)
FOR [WeekDay] IN ([1],[2],[3],[4],[5],[6],[7])
) p
Name Monday Tuesday Wednesday Thursday Friday Saturday Sunday
--------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
关羽 早班 晚班 NULL NULL NULL NULL NULL
居家护工2 早班 早班 晚班,中班 NULL 中班 早班,中班 NULL
------解决思路----------------------
select distinct a.Name, stuff((select ','+cast(Monday as nvarchar(max)) from (select nw.Name,
case n.WeekDay when 1 then Shift else 0 end as 'Monday',
case n.WeekDay when 2 then Shift else 0 end as 'Tuesday',
case n.WeekDay when 3 then Shift else 0 end as 'Wednesday',
case n.WeekDay when 4 then Shift else 0 end as 'Thursday',
case n.WeekDay when 5 then Shift else 0 end as 'Friday',
case n.WeekDay when 6 then Shift else 0 end as 'Saturday',
case n.WeekDay when 7 then Shift else 0 end as 'Sunday'
from [NurseArrangeEmployees] n
join NurseWorkers nw on n.EmployeeId=nw.Id
join DictionaryItems d on n.Shift=d.Id
where n.NurseGroup=1
) b where
a.Name =b.Name for XML path('') ),1,1,'') Monday from (select nw.Name,
case n.WeekDay when 1 then Shift else 0 end as 'Monday',
case n.WeekDay when 2 then Shift else 0 end as 'Tuesday',
case n.WeekDay when 3 then Shift else 0 end as 'Wednesday',
case n.WeekDay when 4 then Shift else 0 end as 'Thursday',
case n.WeekDay when 5 then Shift else 0 end as 'Friday',
case n.WeekDay when 6 then Shift else 0 end as 'Saturday',
case n.WeekDay when 7 then Shift else 0 end as 'Sunday'
from [NurseArrangeEmployees] n
join NurseWorkers nw on n.EmployeeId=nw.Id
join DictionaryItems d on n.Shift=d.Id
where n.NurseGroup=1
) a group by a.Name, a.Monday ,a.Friday,a.Saturday,a.Sunday,a.Thursday,a.Tuesday,a.Wednesday
这样可以查出周一的然。先用这种方法查出七天的 ,然后在在外面包一层。