Obteniendo columnas de un join que está dentro de otro join para que aparezcan en la salida
Estoy utilizando SQL Server 2016.
Aquí está parte de mi consulta (la única parte que importa para esto) con algunas columnas innecesarias eliminadas:
SELECT DISTINCT
S.Status,
DT.scheduledstartdate
DT.actualstartdate
DT.scheduledenddate
MAX(CASE DD.Detail WHEN ‘Note’ THEN DD.Value END) Notas,
MAX(CASE DD.Detail WHEN ‘Late’ THEN DD.[Value] END) Motivo,
FROM
dbo.View_RptMod S
JOIN
[dbo].[View_Phase] P ON P.Studyd = S.Studyd
JOIN
[dbo].[View_Prop] VP ON VP.[Studyd] = S.Studyd
JOIN
(SELECT
[RowId], [actualstartdate], [scheduledstartdate],[scheduledenddate], [comments]
FROM
[dbo].[DataInfo] DT
JOIN
(SELECT [RowId], [Detail], [Value]
FROM dbo.DataDetail) DD ON DD.RowId = DT.RowId
WHERE
[scheduledstartdate] IS NOT NULL) DT ON DT.PhaseRowId = P.phaserowid
Como puedes ver, estoy haciendo muchos joins. Si elimino
MAX(CASE DD.Detail WHEN ‘Note’ THEN DD.Value END) Notas,
MAX(CASE DD.Detail WHEN ‘Motivo’ THEN DD.Value END) Motivos,
de la parte superior de mi consulta que selecciona todas las variables en toda la consulta, se ejecuta sin problemas, pero luego me faltan dos columnas que necesito. Estoy obteniendo un error:
El identificador “DD.Detail”/”DD.Value” de varias partes no se puede enlazar
cuando lo ejecuto con los MAX(CASE…). He intentado ejecutarlo sin “DD.” (solo Detail/Value solo) pero aparece el mismo mensaje de error.
Las dos declaraciones MAX(CASE…) hacen básicamente lo que un pivot hace, donde obtengo la información de una columna y “creo” otra columna en función de esos valores.
Ya he buscado este mensaje de error y me pregunto si tal vez simplemente no lo entiendo, pero ¿cómo llamo correctamente una columna de un join que está dentro de otra declaración join, para que cuando ejecute la consulta, esa columna aparezca en la salida?
Sin MAX(CASE….) mi salida se ve así:
Status | scheduledstartdate | actualstartdate |
---|---|---|
Cerrado | 2019-01-01 | 2021-01-01 |
Abierto | 2021-10-31 | 2021-09-10 |
Lo que me gustaría que se viera mi salida (con MAX(CASE…) o similar) es así:
Status | scheduledstartdate | actualstartdate | Notas | Motivos |
---|---|---|---|---|
Cerrado | 2019-01-01 | 2021-01-01 | Otra Nota | segunda razón |
Abierto | 2021-10-31 | 2021-09-10 | tercer nota | tercer motivo |
He visto personas con este mensaje de error aquí, pero no he encontrado una que termine siendo similar a lo que estoy haciendo, a menos que, nuevamente, simplemente no lo entiendo correctamente. Algunos dicen que el esquema [dbo] podría ser incorrecto, pero si lo elimino, todavía obtengo el mensaje de error.
davy.ai
Parece que está teniendo problemas para hacer funcionar las declaraciones
MAX(CASE...)
en su consulta. Parece que está intentando usar las declaracionesMAX(CASE...)
para crear dos columnas adicionales en su salida,Notas
yRazones
.El problema al que se enfrenta es que las declaraciones
MAX(CASE...)
están haciendo referencia a columnas de la tablaDataDetail
, que se une a la tablaDataInfo
, que luego se une a otras tablas en su consulta. Esto significa que las declaracionesMAX(CASE...)
deben hacer referencia a la tablaDataDetail
usando el aliasDD
que le ha dado.Para solucionar este problema, debe cambiar las declaraciones
MAX(CASE...)
a lo siguiente:MAX(CASE DD.Detail WHEN 'Nota' THEN DD.Value END) Notas,
MAX(CASE DD.Detail WHEN 'Razón' THEN DD.[Value] END) Razones,
Esto debería permitir que la consulta se ejecute correctamente y le dé la salida que está buscando.