Как использовать COALESCE ИЛИ ISNULL в размещенном слове IN внутри WHERE

У меня есть следующий рукописный шрифт, который производит мне таблицу центр:

DECLARE @Anio INT = 2016;
DECLARE @Userlogin_Negocio INT = NULL;
DECLARE @NumeroEjecutivoTI INT = NULL;
DECLARE @NumeroFuncionario INT = 6157;

SET LANGUAGE Spanish;

SELECT
    NOMBRE_MES,
    COALESCE([TI], NULL) TI,
    COALESCE([PENDIENTE USUARIO], NULL) Usuario,
    COALESCE([EN ESPERA], NULL) EnEspera,
    COALESCE([CONCLUIDO], NULL) CERRADO,
    COALESCE([RECHAZADO], NULL) RECHAZADO,
    (COALESCE([TI], 0) + COALESCE([PENDIENTE USUARIO], 0) + COALESCE([EN ESPERA], 0)) AS ACTIVO
FROM
    (SELECT
        MONTH(rat1.fecha_ingreso) AS NUMERO_MES,
        LEFT(DATENAME(MONTH, rat1.fecha_ingreso), 3) AS NOMBRE_MES,
        et.ET_NOMBRE_ETAPA AS ETAPA,
        COUNT(DISTINCT rat1.IDT1) AS CANTIDAD
    FROM
        ALLRATIONAL rat1
        INNER JOIN RAT_PA_ESTADOS est1 ON est1.EST_NOMBRE_ESTADO = rat1.name COLLATE SQL_Latin1_General_CP1_CI_AS
        INNER JOIN RAT_PA_ESTADOS_ETAPAS et ON et.ET_CODIGO_ETAPA = est1.EST_CODIGO_ETAPA
    WHERE
        YEAR(rat1.fecha_ingreso) = @Anio AND
        rat1.usuario_negocio_login = COALESCE(CONVERT(VARCHAR(150), @Userlogin_Negocio), rat1.usuario_negocio_login) AND
        rat1.num_gestor_negocio = COALESCE(@NumeroEjecutivoTI, rat1.num_gestor_negocio) AND

        rat1.NOMBRET4 COLLATE SQL_Latin1_General_CP1_CI_AS IN
            (SELECT SU_NOMBRE_SISTEMA
            FROM RAT_PA_SISTEMASxUSUARIO
            WHERE SU_NUMERO_FUNCIONARIO = @NumeroFuncionario)
    GROUP BY
        MONTH(rat1.fecha_ingreso), LEFT(DATENAME(MONTH, rat1.fecha_ingreso), 3), et.ET_NOMBRE_ETAPA) SOURCE
    PIVOT
    (
        SUM(SOURCE.CANTIDAD) FOR SOURCE.ETAPA IN ([TI], [PENDIENTE USUARIO], [EN ESPERA], [CONCLUIDO], [RECHAZADO])
    ) AS PIVOTABLE
ORDER BY
    NUMERO_MES ASC;

Также как и эта я функционирует хорошо, WHERE он делает желанные фильтры, но когда я распределяю переменную @NumeroFuncionario = NULL меня не возвращает никакой реестр, я нуждаюсь в том, что если @NumeroFuncionario он NULL тогда не принимайте во внимание этот фильтр и я возвратился данные.

Как я могу делать это? я пробовал делая это таким:

rat1.NOMBRET4 COLLATE SQL_Latin1_General_CP1_CI_AS IN
            (COALESCE( (SELECT SU_NOMBRE_SISTEMA
            FROM RAT_PA_SISTEMASxUSUARIO
            WHERE SU_NUMERO_FUNCIONARIO = @NumeroFuncionario) , rat1.NOMBRET4 COLLATE SQL_Latin1_General_CP1_CI_AS))

И когда он NULL если оно функционирует, но когда этот параметр @NumeroFuncionario у него есть стоимость он показывает мне следующую ошибку:

Субконсультация возвратила более одной стоимости, что не правильно, когда он идет далее =! =, <<=,>,> =, или когда он используется как выражение.

2
задан 25.01.2017, 21:00
0 ответов

Выровняв сравнивать переменную с NULL используя SQL Server того, чтобы быть с IS NULL или IS NOT NULL в случае отрицания.

В твоем случае вместо того, чтобы использовать @NumeroFuncionario = NULL пробуй с @NumeroFuncionario IS NULL.

1
ответ дан 03.12.2019, 17:30
  • 1
    Я не понимаю твой ответ... в sí ntesis, который я должен помещать в мой рукописный шрифт для того, чтобы оно функционировало? –  25.01.2017, 21:06
  • 2
    Actualicé ответ, я надеюсь, что он остается má s просвет :) –  25.01.2017, 21:07
  • 3
    Этот не друг не ошибка, когда я говорю NumeroFuncionario = NULL, я имею в виду это: ПРИЗНАЙТЕ NumeroFuncionario INT = NULL, в asignació n переменной. Таким же образом спасибо, хотя проблема не является этой. –  25.01.2017, 22:25
  • 4
    Ах ok, он был запутан по этому поводу, я буду давать ему другой осмотр твоему có я говорю, чтобы видеть qué está происходя –  25.01.2017, 22:28

И когда это NULL, если оно функционирует, но когда у этого параметра @NumeroFuncionario есть стоимость, он показывает мне ошибку

Ты должен проверять, если таблица RAT_PA_SISTEMASxUSUARIO обладай стоимостью NULL в колонне SU_NOMBRE_SISTEMA.

Если я понял хорошо твою проблему, я предлагаю тебе применить эти изменения:

  1. Измени твою субконсультацию таким образом:

    SELECT TOP 1 SU_NOMBRE_SISTEMA
    FROM RAT_PA_SISTEMASxUSUARIO
    WHERE SU_NUMERO_FUNCIONARIO = @NumeroFuncionario
    

Объяснение: Так как твоя субконсультация возвращает тебе более одной стоимости, в этом одиноком случае ты принес бы первый элемент, который выполняет условие WHERE.

  1. Согласно следующему ответу, ты можешь издавать твою консультацию SQL таким образом:

    SELECT TOP 1 SU_NOMBRE_SISTEMA
    FROM RAT_PA_SISTEMASxUSUARIO
    WHERE SU_NUMERO_FUNCIONARIO = COALESCE(NULLIF(@NumeroFuncionario, ''), SU_NUMERO_FUNCIONARIO);
    

Однако, как он комментировал тебе, твоя субконсультация приносит более одного реестра, из-за этого, перед тем, как делать это изменение, подтверждает porqué ты получаешь более одной информации в субконсультации.

0
ответ дан 03.12.2019, 17:30
  • 1
    Я нуждаюсь в том, чтобы санкционировать, что NumeroFuncionario, который я ввожу в компьютер в эту страницу, они показали его ему só это реестры, где он считает распределенной какую-либо из этих систем, поэтому дело в том, что я нуждаюсь в том, чтобы поместить IN allí и не использовать top (1). Это проблема, которая у меня есть –  25.01.2017, 22:58
  • 2
    @AlonsoFallas другая opció n смоги быть: вооружать твой рукописный шрифт способа, в котором является в этой ответа . Allí ты создаешь condició n для того, чтобы ты изменил твою консультацию SQL. Удача. –  26.01.2017, 00:53
  • 3
    Это хорошая идея, я буду пробовать с этой opció n, Спасибо @Mauricio –  26.01.2017, 15:56