es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que está teniendo problemas para hacer funcionar las declaraciones MAX(CASE...) en su consulta. Parece que está intentando usar las declaraciones MAX(CASE...) para crear dos columnas adicionales en su salida, Notas y Razones.

    El problema al que se enfrenta es que las declaraciones MAX(CASE...) están haciendo referencia a columnas de la tabla DataDetail, que se une a la tabla DataInfo, que luego se une a otras tablas en su consulta. Esto significa que las declaraciones MAX(CASE...) deben hacer referencia a la tabla DataDetail usando el alias DD 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.

Comments are closed.