当我运行下面的查询时
SELECT
COUNT(COALESCE(CASE PARTPPHY.TITRE
WHEN 1 THEN 'Monsieur '
WHEN 2 THEN 'Madame '
WHEN 3 THEN 'Madame '
ELSE ''
END + PARTPPHY.IDENTITE, PARTPPHY.IDENTITE)) AS ident,
RESPONSABLES.DIR_LOC,
PARTPPHY.IU_PART_PP,
COALESCE(CASE PARTPPHY.TITRE
WHEN 1 THEN 'Monsieur '
WHEN 2 THEN 'Madame '
WHEN 3 THEN 'Madame '
ELSE ''
END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE) AS IDENTITE,
FONCTIONS_ECO.LIBEL AS LIBEL_FONCTION
FROM
RESPONSABLES
INNER JOIN
ETABLISSEMENTS ON ETABLISSEMENTS.IU_ETS = RESPONSABLES.IU_ETS
LEFT OUTER JOIN
PARTPPHY ON RESPONSABLES.IU_PART_PP = PARTPPHY.IU_PART_PP
LEFT OUTER JOIN
FONCTIONS_ECO ON FONCTIONS_ECO.IU_FONC_ECO = RESPONSABLES.IU_FONC
WHERE
ETABLISSEMENTS.IU_ETS = 14783
AND RESPONSABLES.GESTDEL = 1
GROUP BY
RESPONSABLES.DIR_LOC,
PARTPPHY.IU_PART_PP,
COALESCE(CASE PARTPPHY.TITRE WHEN 1 THEN 'Monsieur ' WHEN 2 THEN 'Madame ' WHEN 3 THEN 'Madame ' ELSE '' END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE),
FONCTIONS_ECO.LIBEL
这是我的结果
然而,当我使用此查询时
SELECT COUNT(COALESCE(CASE PARTPPHY.TITRE
WHEN 1 THEN 'Monsieur '
WHEN 2 THEN 'Madame '
WHEN 3 THEN 'Madame '
ELSE '' END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE)) AS ident,
RESPONSABLES.DIR_LOC,
PARTPPHY.IU_PART_PP,
COALESCE(CASE PARTPPHY.TITRE WHEN 1 THEN 'Monsieur ' WHEN 2 THEN 'Madame ' WHEN 3 THEN 'Madame ' ELSE '' END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE) AS IDENTITE,
FONCTIONS_ECO.LIBEL AS LIBEL_FONCTION
FROM RESPONSABLES
INNER JOIN ETABLISSEMENTS ON ETABLISSEMENTS.IU_ETS = RESPONSABLES.IU_ETS
LEFT OUTER JOIN PARTPPHY ON RESPONSABLES.IU_PART_PP = PARTPPHY.IU_PART_PP
LEFT OUTER JOIN FONCTIONS_ECO ON FONCTIONS_ECO.IU_FONC_ECO = RESPONSABLES.IU_FONC
WHERE ETABLISSEMENTS.IU_ETS = 1
AND RESPONSABLES.GESTDEL = 1
GROUP BY RESPONSABLES.DIR_LOC,
PARTPPHY.IU_PART_PP,
COALESCE(CASE PARTPPHY.TITRE WHEN 1 THEN 'Monsieur ' WHEN 2 THEN 'Madame ' WHEN 3 THEN 'Madame ' ELSE '' END + PARTPPHY.IDENTITE,PARTPPHY.IDENTITE),
FONCTIONS_ECO.LIBEL
我有这个
我的问题如下:
null
也不是空格:它是什么?由于
答案 0 :(得分:3)
使用不带GROUP BY子句的COUNT时,即使WHERE子句不等于表中的任何记录,也总会返回一行。但是在使用GROUP BY子句时,只有在WHERE子句条件为真时才会返回记录。
请检查以下测试脚本
DECLARE @TEST TABLE(ID INT)
INSERT INTO @TEST VALUES(10)
--1.
SELECT COUNT(*) FROM @TEST WHERE ID = 11 --Result is 0
--2.
SELECT COUNT(*),ID FROM @TEST WHERE ID = 11 GROUP BY ID --No Result
此处第一个查询始终返回结果
(No column name)
0
但第二个问题不是。
您可以修改您的第二个查询,如下面的脚本,以获得' 0'结果
SELECT ISNULL(( SELECT COUNT(*) FROM @TEST WHERE ID = 11 GROUP BY ID ),0)
答案 1 :(得分:1)
还有一个有效选项。在这两种情况下,您使用INNER JOIN,这是独占连接意义,如果不满足连接条件则不返回任何数据,或者更准确地说,结果是空集。
您的INNER JOIN
条件已在ETABLISSEMENTS.IU_ETS = RESPONSABLES.IU_ETS
在第一个查询中,您的where语句显示为
WHERE ETABLISSEMENTS.IU_ETS = 14783 AND RESPONSABLES.GESTDEL = 1
这是您有空数据集的地方
在第二个查询中你的where语句是
WHERE ETABLISSEMENTS.IU_ETS = 1 AND RESPONSABLES.GESTDEL = 1
所以回答你的第一个问题:
可能没有匹配记录,其中ETABLISSEMENTS.IU_ETS = 14783 AND RESPONSABLES.GESTDEL = 1
因此我们得到一个空集
在第二种情况下,满足where语句并且两个表中都有相应的条目,因此我们有结果。
根据您感兴趣的加入的哪一方,即在哪个表格中您希望该行存在,您可以切换
JOIN to OUTER JOIN (LEFT or RIGHT)
外连接是包含的,这意味着即使相应表中没有记录,它也会将表中左边或右边的所有行返回到连接。 然后在相应的表上应用count,即id列。如果没有记录,那么你将获得0
举例说明
CREATE TABLE #Left
(
id INT
,col1 CHAR(3)
)
CREATE TABLE #Right
(
id INT
,col2 CHAR(3)
)
INSERT INTO #Right
( id, col2)
VALUES
(1,'c1')
,(2,'c2')
,(3,'c4')
,(4,'c5')
INSERT INTO #Left
( id, col1)
VALUES
(1,'c1')
,(2,'c2')
,(3,'c3')
,(4,'c5')
-- empty set
SELECT
*
FROM #Left L
INNER JOIN #Right R
ON L.col1 = R.col2
WHERE col1 = 'c3'
-- matching rows
SELECT
*
FROM #Left L
INNER JOIN #Right R
ON L.col1 = R.col2
WHERE col1 = 'c2'
-- Left Join
SELECT
L.*
,COUNT(R.col2)
FROM #Left L
LEFT JOIN #Right R
ON L.col1 = R.col2
WHERE col1 = 'c3'
GROUP BY L.id, L.col1