当前位置: 代码迷 >> Sql Server >> sql有关问题,应该算是Group By的有关问题
  详细解决方案

sql有关问题,应该算是Group By的有关问题

热度:99   发布时间:2016-04-24 08:47:34.0
sql问题,应该算是Group By的问题

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 早班 早班 晚班/中班 中班 早班/中班



求大神指点!!!!!!!!!!!!!!
------解决思路----------------------
引用:

我想变成:
执行完结果是:
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

这样可以查出周一的然。先用这种方法查出七天的 ,然后在在外面包一层。
  相关解决方案