【发布时间】:2016-04-11 21:37:41
【问题描述】:
我有一个表 T_DONNE,它只是导入数据的类型。 Noid = ID Libelle = 标签
NOID LIBELLE
1 WEB
2 FTP
客户:
CODE_CL RS_NOM VILLE TYPE_CLIENT
85000 test La roche 1
85001 azerty Nantes 2
85002 qsdfg Nantes 1
LETTRE_VOIT_FINAL:就像客户命令的物品
NOID CODE_CLIENT RS_NOM VILLE_EXP FACTURATION DATE_CLOTUR_REEL
1 85000 test La roche 2 2016-01-07 15:02:59
2 85000 test La roche 2 2016-01-07 15:03:59
3 85001 azerty Nantes 2 2016-01-07 15:04:59
我想要的是:
CODE_CLIENT RS_NOM VILLE_EXP LIBELLE TOTAL
85000 test La roche WEB 2
85001 azerty Nantes FTP 1
85002 qsdfg Nantes WEB 0
和 sql:
SELECT
LETTRE_VOIT_FINAL.CODE_CLIENT
,LETTRE_VOIT_FINAL.RS_NOM
,LETTRE_VOIT_FINAL.VILLE_EXP
,T_DONNE.LIBELLE
,count (LETTRE_VOIT_FINAL.NOID) as TOTAL
FROM LETTRE_VOIT_FINAL
LEFT OUTER JOIN CLIENT ON CLIENT.CODE_CL = LETTRE_VOIT_FINAL.CODE_CLIENT
LEFT JOIN T_DONNE ON T_DONNE.NOID = CLIENT.TYPE_CLIENT
WHERE DATE_CLOTUR_REEL BETWEEN @DateDeb AND @DateFin
and FACTURATION = @FACTURATION
and STATUT_LV = 2
group by CODE_CLIENT,VILLE_EXP,RS_NOM,LIBELLE
它并不完全有效。它只显示:
CODE_CLIENT RS_NOM VILLE_EXP LIBELLE TOTAL
85000 test La roche WEB 2
85001 azerty Nantes FTP 1
我认为它不起作用,因为 NULL 值和计数功能。
我想列出所有客户并计算她/他命令的项目。 我的语法只显示有命令的客户端,我错过了在我的示例中没有命令的客户端是客户端 85002
我也倒过来了,结果还是一样:
SELECT
count (LETTRE_VOIT_FINAL.NOID) as TOTLV
,CODE_CL
,VILLE
,[RS_NOM]
,LIBELLE
FROM CLIENT
LEFT JOIN LETTRE_VOIT_FINAL ON CLIENT.CODE_CL = LETTRE_VOIT_FINAL.CODE_CLIENT
LEFT JOIN T_DONNE ON T_DONNE.NOID = CLIENT.TYPE_CLIENT
WHERE DATE_CLOTUR_REEL BETWEEN @DateDeb AND @DateFin
and FACTURATION = @FACTURATION
and STATUT_LV = 2
group by CODE_CL,VILLE,RS_NOM,LIBELLE
@DateDeb 日期时间,@DateFin 日期时间,@FACTURATION int',@DateDeb='2016-01-07 12:00:00',@DateFin='2016-01-07 23:59:59',@FACTURATION =2
【问题讨论】:
-
您的查询和您的数据不一致。您的查询中有未提及的列作为任何表的一部分。在任何情况下,您都希望将条件从
WHERE移动到适当的ON子句。 -
对不起,我已经写好了
-
限定列名,table_name.column_name,这样我们就可以知道一个列属于哪个表。
-
请在所有列上使用 table.column 表示法,如果我们不知道该列来自哪个表,我们将无法帮助您
-
@Soft8Stev 。 . .
where非常重要,因为它将外连接变为内连接。部分或全部条件需要移到on子句中。
标签: sql sql-server sql-server-2008 join group-by