2017-09-12 1 views
-1

보고 서비스에 표시 할 하나의 마스터 테이블을 만들어야하지만 데이터 결합 방법에 문제가 있습니다. 특정 날짜에 예약 된 기숙사의 정보를 저장하는 "Reservaciones"라는 테이블이 하나 있습니다. 예를 들면 지금열을 피벗 열

, 미안이 필드에 의해 그룹핑 정보 :

  1. R.ClaTrab을 WorkerId
  2. R.ClaUbicacion AS UbicationID
  3. R.ClaEstancia AS ResidenceID
  4. R AS .FechaIni AS InitialDay
  5. R.FechaFin AS LastDay

그 결과는 First result**

입니다. 그림에서 알 수 있듯이 2 열이 중복되어 숫자 4와 숫자 5가 정확합니다.

는 지금까지 내가 결과이 desire result처럼되고 싶어 내 코드

SELECT 
R.ClaTrab AS WorkerId, 
MAX(E.NomEstancia) AS ResidenceName, 
R.ClaUbicacion AS UbicationID, 
R.ClaEstancia AS ResidenceID, 
DATEDIFF(DAY, R.FechaIni, R.FechaFin) AS NumberDays, 
R.FechaIni AS InitialDay, 
R.FechaFin AS LastDay 
FROM Reservaciones AS R 
INNER JOIN Estancias AS E ON E.ClaEstancia = R.ClaEstancia 
WHERE E.ClaUbicacionEst = 3 
GROUP BY R.ClaTrab,R.ClaUbicacion, R.ClaEstancia, R.FechaIni, R.FechaFin 
ORDER BY R.FechaIni 

이지만, 내가, 내가 PIVOT을 시도 그것을 수행하는 방법을 잘 모릅니다하지만 난 내가 원하는 결과를 얻을 캔트.

자세한 정보가 필요하면 알려주세요. 대단히 감사합니다.

해결책 : 내가 무슨 짓을 는, 같은 기숙사에 PIVOT 새로운 컬럼의 결과를 노동자의 그룹을 만들에 의해 PARTITION을 통해 행 번호()를 사용합니다. 새 쿼리에서 SNIPPET

SELECT * FROM(
SELECT 
MAX(E.NomEstancia) AS ResidenceName, 
R.FechaIni AS InitialDay, 
R.FechaFin AS LastDay, 
DATEDIFF(DAY, R.FechaIni, R.FechaFin) AS NumberDays, 
T.NomTrab AS Worker, 
R.ClaUbicacion AS UbicationID, 
R.ClaEstancia AS ResidenceID, 
ROW_NUMBER() OVER(PARTITION BY FechaIni,FechaFin, R.ClaUbicacion, R.ClaEstancia ORDER BY T.NomTrab) AS GUEST 
FROM Reservaciones AS R 
INNER JOIN Estancias AS E ON E.ClaEstancia = R.ClaEstancia 
INNER JOIN Trabajadores AS T ON T.ClaTrab = R.ClaTrab 
WHERE E.ClaUbicacionEst = 3 
GROUP BY T.NomTrab, R.ClaUbicacion, R.ClaEstancia, R.FechaIni,R.FechaFin) AS ONE 
PIVOT(MAX(Worker) FOR GUEST IN ([1],[2],[3])) AS pvt 

나는 당신이 분을 사용할 수 있습니다 만이 명 노동자가있을 수 있기 때문에 새로운이 노동자

+1

환영 SO에! 다음에 SO에 대한 좋은 질문을 게시하는 방법을 안내해주십시오. https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – Eli

+0

동적 피벗에 대한이 게시물을보십시오. https://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query/10404455#10404455 – Xedni

+0

두 명의 작업자가 할당됩니다. 그렇지 않은 경우, 하드 코딩 할 수있는 최대 값이 있습니까? –

답변

0

의 이름을 얻기 위해 가입 추가 맥스.

with cte as(
SELECT 
    R.ClaTrab AS WorkerId, 
    MAX(E.NomEstancia) AS ResidenceName, 
    R.ClaUbicacion AS UbicationID, 
    R.ClaEstancia AS ResidenceID, 
    DATEDIFF(DAY, R.FechaIni, R.FechaFin) AS NumberDays, 
    R.FechaIni AS InitialDay, 
    R.FechaFin AS LastDay 
FROM 
    Reservaciones AS R 
INNER JOIN 
    Estancias AS E 
    ON E.ClaEstancia = R.ClaEstancia 
WHERE 
    E.ClaUbicacionEst = 3 
GROUP BY 
    R.ClaTrab, 
    R.ClaUbicacion, 
    R.ClaEstancia, 
    R.FechaIni, 
    R.FechaFin), 

cte2 as(
select 
    ResidenceName 
    ,UbicationID 
    ,ResidenceID 
    ,NumberDays 
    ,InitalDay 
    ,LastDay 
    ,Worker1 = max(WorkerId) 
    ,Worker2 = min(WorkerId) 
from 
    cte 
group by 
    ResidenceName 
    ,UbicationID 
    ,ResidenceID 
    ,NumberDays 
    ,InitalDay 
    ,LastDay) 

select 
    ResidenceName 
    ,UbicationID 
    ,ResidenceID 
    ,NumberDays 
    ,InitalDay 
    ,LastDay 
    ,Worker1 
    ,Worker2 = case when Worker1 = Worker2 then NULL else Worker2 end 
from 
    cte2 

ONLINE DEMO WITH PARTIAL TEST DATA

+0

나는 그것을 작동시킬 수 없었다. cte2에서 오류가 발생했다. 절별로 그룹을 만들려면 – deduardolv

+0

편집을 참조하십시오. @deduardolv – scsimon

+0

죄송합니다. 내 코드와 혼동 스러웠지만 해결책을 찾았습니다. – deduardolv