Sql server 具有透视和分组内部联接的SQL SERVER查询

Sql server 具有透视和分组内部联接的SQL SERVER查询,sql-server,inner-join,Sql Server,Inner Join,我尝试了PIVOT方法和CASE WHEN方法,但我还没有从我的表格中找到这个结果 这就是我们需要的: personnel_id SATURDAY SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY Juan Jose OFF OFF 6-2 6- 2 OFF OFF 6-2 从这些表格中: [TABLES FROM SQL SERVER][1] 到目前为止,我已

我尝试了
PIVOT
方法和
CASE WHEN
方法,但我还没有从我的表格中找到这个结果

这就是我们需要的:

personnel_id  SATURDAY SUNDAY  MONDAY   TUESDAY   WEDNESDAY THURSDAY  FRIDAY
Juan Jose       OFF     OFF     6-2        6- 2      OFF      OFF      6-2
从这些表格中:

[TABLES FROM SQL SERVER][1]
到目前为止,我已经:

SELECT  
    personnel_name, 
    CASE WHEN day_name = 'saturday' then entrada END AS SAT,
    CASE WHEN day_name = 'sunday' then entrada END AS SUN,
    CASE WHEN day_name = 'monday' then entrada END AS MON,
    CASE WHEN day_name = 'tuesday' then entrada END AS TUE,
    CASE WHEN day_name = 'wednesday' then entrada END AS WED,
    CASE WHEN day_name = 'thursday' then entrada END AS THUR,
    CASE WHEN day_name = 'friday' then entrada END AS FRI
FROM
   (SELECT 
        personnel_name, tbl_shifts.entrada, tbl_days.day_name
    FROM 
        tbl_personnel_weekshift 
    INNER JOIN 
        tbl_personnel ON tbl_personnel_weekshift.personnel_id = tbl_personnel.personnel_id
    INNER JOIN 
        tbl_shifts ON tbl_personnel_weekshift.shift_id = tbl_shifts.shift_id
    INNER JOIN 
        tbl_days ON tbl_personnel_weekshift.day_id = tbl_days.day_id) AS IIIPO;
返回以下结果:

我需要找到一个好的方法,或者找到一种只在一行中分组的方法,并去掉空值


感谢各位花费的时间和精力

我想你们只需要条件聚合:

SELECT personnel_name, 
       MAX(CASE WHEN day_name = 'saturday' then entrada END) AS SAT,
       MAX(CASE WHEN day_name = 'sunday' then entrada END) AS SUN,
       MAX(CASE WHEN day_name = 'monday' then entrada END) AS MON,
       MAX(CASE WHEN day_name = 'tuesday' then entrada END) AS TUE,
       MAX(CASE WHEN day_name = 'wednesday' then entrada END) AS WED,
       MAX(CASE WHEN day_name = 'thursday' then entrada END) AS THUR,
       MAX(CASE WHEN day_name = 'friday' then entrada END) AS FRI
FROM (SELECT personnel_name, tbl_shifts.entrada, tbl_days.day_name
      FROM tbl_personnel_weekshift INNER JOIN
           tbl_personnel
           ON tbl_personnel_weekshift.personnel_id = tbl_personnel.personnel_id INNER JOIN
           tbl_shifts
           ON tbl_personnel_weekshift.shift_id = tbl_shifts.shift_id INNER JOIN
           tbl_days
           ON tbl_personnel_weekshift.day_id = tbl_days.day_id
     ) IIIPO
GROPU BY personnel_name;
SELECT personnel_name, 
       MAX(CASE WHEN day_name = 'saturday' then entrada END) AS SAT,
       MAX(CASE WHEN day_name = 'sunday' then entrada END) AS SUN,
       MAX(CASE WHEN day_name = 'monday' then entrada END) AS MON,
       MAX(CASE WHEN day_name = 'tuesday' then entrada END) AS TUE,
       MAX(CASE WHEN day_name = 'wednesday' then entrada END) AS WED,
       MAX(CASE WHEN day_name = 'thursday' then entrada END) AS THUR,
       MAX(CASE WHEN day_name = 'friday' then entrada END) AS FRI
FROM (SELECT personnel_name, tbl_shifts.entrada, tbl_days.day_name
      FROM tbl_personnel_weekshift INNER JOIN
           tbl_personnel
           ON tbl_personnel_weekshift.personnel_id = tbl_personnel.personnel_id INNER JOIN
           tbl_shifts
           ON tbl_personnel_weekshift.shift_id = tbl_shifts.shift_id INNER JOIN
           tbl_days
           ON tbl_personnel_weekshift.day_id = tbl_days.day_id
     ) IIIPO
GROPU BY personnel_name;