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(*),“”),但它仍然会得到一个NULLTrycoalesce(COUNT(*),0)
,然后它会将null值替换为0Thanks!如何替换空值。我尝试使用ISNULL(COUNT(*),“”),但它仍然会得到一个NULLTrycoalesce(COUNT(*),0)
,然后它会将null值替换为0