Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择每个人在其他表中的文档数量_Sql_Sql Server - Fatal编程技术网

Sql 选择每个人在其他表中的文档数量

Sql 选择每个人在其他表中的文档数量,sql,sql-server,Sql,Sql Server,我有三张桌子 客户、文档和客户文档。 第一个是客户机,每个客户机的信息都在这里。 第二个是文档,文档可以放在系统中。 第三个是ClientDocuments,哪个客户端拥有哪个文档 我必须选择从客户那里获取信息的位置,以及他们拥有的3种类型的文档的数量。 例如,客户1有一个文件名为“Contrato Social”,客户2有一个文件名为“Ata de Negociação”。 在select必须返回每个客户机中,在列CONTATOSOCIAL returns 1中,Ata NEGOGACIAO

我有三张桌子

客户、文档和客户文档。 第一个是客户机,每个客户机的信息都在这里。 第二个是文档,文档可以放在系统中。 第三个是ClientDocuments,哪个客户端拥有哪个文档

我必须选择从客户那里获取信息的位置,以及他们拥有的3种类型的文档的数量。 例如,客户1有一个文件名为“Contrato Social”,客户2有一个文件名为“Ata de Negociação”。 在select必须返回每个客户机中,在列CONTATOSOCIAL returns 1中,Ata NEGOGACIAO返回2,Aceite de Condições Gerais返回0

我这样做是为了展示

select idFornecedor,
txtNomeResumido,
txtNomeCompleto,
--txtEmail,
--txtSenha,
bitHabilitado,
(SELECT Count(idDocumentosFornecedoresTitulo) FROM tbDocumentosFornecedores WHERE idDocumentosFornecedoresTitulo = 1) AS 'Contrato Social',
(SELECT Count(idDocumentosFornecedoresTitulo) FROM tbDocumentosFornecedores WHERE idDocumentosFornecedoresTitulo = 2) AS 'Ata de Negociação',
(SELECT Count(idDocumentosFornecedoresTitulo) FROM tbDocumentosFornecedores WHERE idDocumentosFornecedoresTitulo = 3) AS 'Aceite de Condições Gerais'
from dbo.tbFornecedores tbf
order by tbf.txtNomeResumido asc
返回以下内容:

但这只是计算数据库中该类型的文档的数量,我想为每个客户端筛选,我该怎么做

工作答复:

select tbf.idFornecedor, tbf.txtNomeResumido, tbf.txtNomeCompleto,
tbf.bitHabilitado,
       sum(case when idDocumentosFornecedoresTitulo = 1 then 1 else 0 end) as contrato_social,
       sum(case when idDocumentosFornecedoresTitulo = 2 then 1 else 0 end) as Ata_de_Negociação,
       sum(case when idDocumentosFornecedoresTitulo = 3 then 1 else 0 end) as Aceite_de_Condições_Gerais
from dbo.tbFornecedores tbf left join
     tbDocumentosFornecedores df
     on tbf.idFornecedor = df.idFornecedor 
group by tbf.idFornecedor, tbf.txtNomeResumido, tbf.txtNomeCompleto, tbf.bitHabilitado
order by tbf.txtNomeResumido asc

您需要某种方法将
tbDocumentosFornecedores
中的行与
tbFornecedores
中的行进行匹配。您的问题不清楚使用了哪一列,但我可能会猜测类似于
idDocumentosFornecedore

您可以使用correlation子句修复查询。但是,我可能会建议使用条件聚合:

select tbf.idFornecedor, tbf.txtNomeResumido, tbf.txtNomeCompleto,
tbf.bitHabilitado,
       sum(case when idDocumentosFornecedoresTitulo = 1 then 1 else 0 end) as contrato_social,
       sum(case when idDocumentosFornecedoresTitulo = 2 then 1 else 0 end) as Ata_de_Negociação,
       sum(case when idDocumentosFornecedoresTitulo = 3 then 1 else 0 end) as Aceite_de_Condições_Gerais
from dbo.tbFornecedores tbf left join
     tbDocumentosFornecedores df
     on tbf.idDocumentosFornecedore = df.idDocumentosFornecedore  -- this is a guess
group by tbf.idFornecedor, tbf.txtNomeResumido, tbf.txtNomeCompleto, tbf.bitHabilitado
order by tbf.txtNomeResumido asc

硬编码ID通常是个糟糕的主意。您的逻辑应该基于实际的标题,而不是ID。添加第四个文档时会发生什么?你为什么数数?客户机可以多次与同一文档关联吗?这看起来像一个pivot问题,也像一个schema问题。