Sql server 当某些查询返回null或0时,如何在单个查询中联接表

Sql server 当某些查询返回null或0时,如何在单个查询中联接表,sql-server,Sql Server,根据每个查询中的一些特定参数,我有三个不同的查询返回不同的计数值。当我分别运行它们时,它们工作正常,但我需要它们返回一个表。因此,当这些查询中的任何一个返回空值时,都不会带来相同的行 第一个查询如下所示: SELECT [dbo].[Medios_Pauta].[ID], [dbo].[Medios_Pauta].[Nombre] AS [Medio] FROM [dbo].[N_Preinscripcion

根据每个查询中的一些特定参数,我有三个不同的查询返回不同的计数值。当我分别运行它们时,它们工作正常,但我需要它们返回一个表。因此,当这些查询中的任何一个返回空值时,都不会带来相同的行

第一个查询如下所示:

SELECT
                [dbo].[Medios_Pauta].[ID],
                [dbo].[Medios_Pauta].[Nombre] AS [Medio]
            FROM [dbo].[N_Preinscripcion]
            INNER JOIN
                [dbo].[Medios_Pauta]
                ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
            WHERE
                ([dbo].[N_Preinscripcion].[Periodo] = @prd)
            GROUP BY
                [dbo].[Medios_Pauta].[ID],
                [dbo].[Medios_Pauta].[Nombre]
SELECT
        [dbo].[Medios_Pauta].[ID] AS [MedioId],
        COUNT(*) AS [regs]
    FROM [dbo].[N_Preinscripcion]
    INNER JOIN
        [dbo].[Medios_Pauta]
        ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
    WHERE
        ([dbo].[N_Preinscripcion].[Periodo] = @prd)
    GROUP BY
        [dbo].[Medios_Pauta].[ID],
        [dbo].[Medios_Pauta].[Nombre]
这将返回以下结果:

|ID    |    Medio         |
---------------------------
|23    |    Prospectos    |
---------------------------
|29    |    Pop up        |
---------------------------
|1     |    Facebook      |
---------------------------
|24    |    Referidos     |
---------------------------
|30    |    Pto. info     |
---------------------------
|4     |    Google        |
---------------------------
|25    |    Directo       |
---------------------------
|5     |    Display       |
---------------------------
|ID    |    Medio         |
---------------------------
|23    |    1379          |
---------------------------
|29    |    8             |
---------------------------
|1     |    54            |
---------------------------
|24    |    2             |
---------------------------
|30    |    4             |
---------------------------
|4     |    325           |
---------------------------
|25    |    501           |
---------------------------
|5     |    6             |
---------------------------
第二个查询如下所示:

SELECT
                [dbo].[Medios_Pauta].[ID],
                [dbo].[Medios_Pauta].[Nombre] AS [Medio]
            FROM [dbo].[N_Preinscripcion]
            INNER JOIN
                [dbo].[Medios_Pauta]
                ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
            WHERE
                ([dbo].[N_Preinscripcion].[Periodo] = @prd)
            GROUP BY
                [dbo].[Medios_Pauta].[ID],
                [dbo].[Medios_Pauta].[Nombre]
SELECT
        [dbo].[Medios_Pauta].[ID] AS [MedioId],
        COUNT(*) AS [regs]
    FROM [dbo].[N_Preinscripcion]
    INNER JOIN
        [dbo].[Medios_Pauta]
        ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
    WHERE
        ([dbo].[N_Preinscripcion].[Periodo] = @prd)
    GROUP BY
        [dbo].[Medios_Pauta].[ID],
        [dbo].[Medios_Pauta].[Nombre]
并带来以下结果:

|ID    |    Medio         |
---------------------------
|23    |    Prospectos    |
---------------------------
|29    |    Pop up        |
---------------------------
|1     |    Facebook      |
---------------------------
|24    |    Referidos     |
---------------------------
|30    |    Pto. info     |
---------------------------
|4     |    Google        |
---------------------------
|25    |    Directo       |
---------------------------
|5     |    Display       |
---------------------------
|ID    |    Medio         |
---------------------------
|23    |    1379          |
---------------------------
|29    |    8             |
---------------------------
|1     |    54            |
---------------------------
|24    |    2             |
---------------------------
|30    |    4             |
---------------------------
|4     |    325           |
---------------------------
|25    |    501           |
---------------------------
|5     |    6             |
---------------------------
第三个查询与第二个查询类似,但在WHERE子句中具有不同的参数,将带来相同的信息,但当其中一个“Medio”选项中没有结果时,它不会带来特定的行:

SELECT
        [dbo].[Medios_Pauta].[ID] AS [MedioId],
        COUNT(*) AS [regs]
    FROM [dbo].[N_Preinscripcion]
    INNER JOIN
        [dbo].[Medios_Pauta]
        ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
    WHERE
        ([dbo].[N_Preinscripcion].[Periodo] = @prd)
        AND
        (
            ([dbo].[N_Preinscripcion].[Estado] = '3') 
            OR
            ([dbo].[N_Preinscripcion].[Estado] = '4') 
            OR
            ([dbo].[N_Preinscripcion].[Estado] = '8') 
            OR
            ([dbo].[N_Preinscripcion].[Estado] = '19') 
            OR
            ([dbo].[N_Preinscripcion].[Estado] = '20') 
            OR
            ([dbo].[N_Preinscripcion].[Estado] = '21')
        ) 

    GROUP BY
        [dbo].[Medios_Pauta].[ID],
        [dbo].[Medios_Pauta].[Nombre]
将返回此文件:

|ID    |    Medio         |
---------------------------
|1     |    9             |
---------------------------
|4     |    35            |
---------------------------
|23    |    100           |
---------------------------
|24    |    2             |
---------------------------
|25    |    152           |
因此,当我将三个查询合并为一个查询时,它将忽略这些行,即使第一个查询中有这些行

SELECT
    [Medios].[Medio],
    [Preinscritos].[regs] AS [Preinscritos],
    [Admitidos].[regs] AS [Admitidos]
    FROM
        (
            SELECT
                [dbo].[Medios_Pauta].[ID],
                [dbo].[Medios_Pauta].[Nombre] AS [Medio]
            FROM [dbo].[N_Preinscripcion]
            INNER JOIN
                [dbo].[Medios_Pauta]
                ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
            WHERE
                ([dbo].[N_Preinscripcion].[Periodo] = @prd)
            GROUP BY
                [dbo].[Medios_Pauta].[ID],
                [dbo].[Medios_Pauta].[Nombre]
        ) [Medios]
        JOIN
        (
            SELECT
                [dbo].[Medios_Pauta].[ID] AS [MedioId],
                COUNT(*) AS [regs]
            FROM [dbo].[N_Preinscripcion]
            INNER JOIN
                [dbo].[Medios_Pauta]
                ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
            WHERE
                ([dbo].[N_Preinscripcion].[Periodo] = @prd)
            GROUP BY
                [dbo].[Medios_Pauta].[ID],
                [dbo].[Medios_Pauta].[Nombre]
        ) [Preinscritos]
        ON [Medios].[ID] = [Preinscritos].[MedioId]
        JOIN
        (
            SELECT
                [dbo].[Medios_Pauta].[ID] AS [MedioId],
                COUNT(*) AS [regs]
            FROM [dbo].[N_Preinscripcion]
            INNER JOIN
                [dbo].[Medios_Pauta]
                ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
            WHERE
                ([dbo].[N_Preinscripcion].[Periodo] = @prd)
                AND
                (
                    ([dbo].[N_Preinscripcion].[Estado] = '3') 
                    OR
                    ([dbo].[N_Preinscripcion].[Estado] = '4') 
                    OR
                    ([dbo].[N_Preinscripcion].[Estado] = '8') 
                    OR
                    ([dbo].[N_Preinscripcion].[Estado] = '19') 
                    OR
                    ([dbo].[N_Preinscripcion].[Estado] = '20') 
                    OR
                    ([dbo].[N_Preinscripcion].[Estado] = '21')
                ) 

            GROUP BY
                [dbo].[Medios_Pauta].[ID],
                [dbo].[Medios_Pauta].[Nombre]
        ) [Admitidos]
        ON [Medios].[ID] = [Admitidos].[MedioId] 
这是该查询的结果:

|Medio        |    Preinscritos    |   Admitidos  |
---------------------------------------------------
|Facebook     |    54              |   9          |
---------------------------------------------------
|Google       |    325             |   35         |
---------------------------------------------------
|Prospectos   |    1379            |   100        |
---------------------------------------------------
|Referidos    |    2               |   2          |
---------------------------------------------------
|Directo      |    501             |   152        |
---------------------------------------------------
因此,正如您所看到的,当我加入查询时,“弹出”、“引用”和“Pto.info”上的结果被忽略,因为在第三个查询(为“Admitidos”列生成结果)上它们为NULL或0


如何实现此咨询?

你能用[Medios]和[Preinscritos]以及[Admitidos]之间的左连接替换JOIN吗?

你能用[Medios]和[Preinscritos]以及[Admitidos]之间的左连接替换JOIN吗

SELECT
[Medios].[Medio],
[Preinscritos].[regs] AS [Preinscritos],
[Admitidos].[regs] AS [Admitidos]
FROM
    (
        SELECT
            [dbo].[Medios_Pauta].[ID],
            [dbo].[Medios_Pauta].[Nombre] AS [Medio]
        FROM [dbo].[N_Preinscripcion]
        INNER JOIN
            [dbo].[Medios_Pauta]
            ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
        WHERE
            ([dbo].[N_Preinscripcion].[Periodo] = @prd)
        GROUP BY
            [dbo].[Medios_Pauta].[ID],
            [dbo].[Medios_Pauta].[Nombre]
    ) [Medios]
    LEFT JOIN
    (
        SELECT
            [dbo].[Medios_Pauta].[ID] AS [MedioId],
            COUNT(*) AS [regs]
        FROM [dbo].[N_Preinscripcion]
        INNER JOIN
            [dbo].[Medios_Pauta]
            ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
        WHERE
            ([dbo].[N_Preinscripcion].[Periodo] = @prd)
        GROUP BY
            [dbo].[Medios_Pauta].[ID],
            [dbo].[Medios_Pauta].[Nombre]
    ) [Preinscritos]
    ON [Medios].[ID] = [Preinscritos].[MedioId]
    LEFT JOIN
    (
        SELECT
            [dbo].[Medios_Pauta].[ID] AS [MedioId],
            COUNT(*) AS [regs]
        FROM [dbo].[N_Preinscripcion]
        INNER JOIN
            [dbo].[Medios_Pauta]
            ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
        WHERE
            ([dbo].[N_Preinscripcion].[Periodo] = @prd)
            AND
            (
                ([dbo].[N_Preinscripcion].[Estado] = '3') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '4') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '8') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '19') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '20') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '21')
            ) 

        GROUP BY
            [dbo].[Medios_Pauta].[ID],
            [dbo].[Medios_Pauta].[Nombre]
    ) [Admitidos]
    ON [Medios].[ID] = [Admitidos].[MedioId] 
因为这样,如果联接动态表为空,它仍将显示行。

请尝试以下方法:

SELECT
[Medios].[Medio],
[Preinscritos].[regs] AS [Preinscritos],
[Admitidos].[regs] AS [Admitidos]
FROM
    (
        SELECT
            [dbo].[Medios_Pauta].[ID],
            [dbo].[Medios_Pauta].[Nombre] AS [Medio]
        FROM [dbo].[N_Preinscripcion]
        INNER JOIN
            [dbo].[Medios_Pauta]
            ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
        WHERE
            ([dbo].[N_Preinscripcion].[Periodo] = @prd)
        GROUP BY
            [dbo].[Medios_Pauta].[ID],
            [dbo].[Medios_Pauta].[Nombre]
    ) [Medios]
    LEFT JOIN
    (
        SELECT
            [dbo].[Medios_Pauta].[ID] AS [MedioId],
            COUNT(*) AS [regs]
        FROM [dbo].[N_Preinscripcion]
        INNER JOIN
            [dbo].[Medios_Pauta]
            ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
        WHERE
            ([dbo].[N_Preinscripcion].[Periodo] = @prd)
        GROUP BY
            [dbo].[Medios_Pauta].[ID],
            [dbo].[Medios_Pauta].[Nombre]
    ) [Preinscritos]
    ON [Medios].[ID] = [Preinscritos].[MedioId]
    LEFT JOIN
    (
        SELECT
            [dbo].[Medios_Pauta].[ID] AS [MedioId],
            COUNT(*) AS [regs]
        FROM [dbo].[N_Preinscripcion]
        INNER JOIN
            [dbo].[Medios_Pauta]
            ON [dbo].[Medios_Pauta].[ID] = [dbo].[N_Preinscripcion].[MedioId] 
        WHERE
            ([dbo].[N_Preinscripcion].[Periodo] = @prd)
            AND
            (
                ([dbo].[N_Preinscripcion].[Estado] = '3') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '4') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '8') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '19') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '20') 
                OR
                ([dbo].[N_Preinscripcion].[Estado] = '21')
            ) 

        GROUP BY
            [dbo].[Medios_Pauta].[ID],
            [dbo].[Medios_Pauta].[Nombre]
    ) [Admitidos]
    ON [Medios].[ID] = [Admitidos].[MedioId] 

因为这样,如果联接动态表为空,它仍将显示行。

左外部联接
左外部联接
谢谢!如何替换空值。我尝试使用ISNULL(COUNT(*),“”),但它仍然会得到一个NULLTry
coalesce(COUNT(*),0)
,然后它会将null值替换为0Thanks!如何替换空值。我尝试使用ISNULL(COUNT(*),“”),但它仍然会得到一个NULLTry
coalesce(COUNT(*),0)
,然后它会将null值替换为0