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