[英]SQL Server - Multiple Counts from multiple tables with the same WHERE clause
我需要來自多個表的多個計數,但是所有表都與同一個表連接,並具有相同的where子句。 我得到了正確的結果,但是,在一個非常大而緩慢的查詢中,並且,我想學習如何改善這一點。
我必須從表中計數:
還有3個SUM,全部來自PedidosDeVendas表。
所有這些查詢都與:-Empresas-PedidosDeVendaXItens
並且所有查詢具有相同的WHERE子句:-WHERE SolicitanteID = {用戶ID} AND數據> ='{初始日期}'AND數據<='{最終日期}'
這是返回我需要的所有結果的查詢:
SELECT U.[ID] AS UniqKey, U.NomeCompleto, R.Regiao,
(SELECT Count(*)
FROM Ocorrencias O
INNER JOIN Nomes N ON (O.ClientesID = N.Codigo AND O.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
WHERE O.UsuariosID = U.[ID]
AND MR.ID_Regiao = R.uniqKey
AND O.Data >= '2012-12-01 00:00:00' AND O.Data <= '2012-12-31 23:59:59') AS Ocorrencias,
(SELECT Count(*)
FROM FollowUp F
INNER JOIN Nomes N ON (F.ClienteID = N.Codigo AND F.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
WHERE SolicitanteID = U.[ID]
AND MR.ID_Regiao = R.uniqKey
AND Data >= '2012-12-01 00:00:00' AND Data <= '2012-12-31 23:59:59') AS FollowUps,
(SELECT Count(*)
FROM v_PropostaComercial PC
INNER JOIN Nomes N ON (PC.ClienteID = N.Codigo AND PC.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
WHERE PC.SolicitanteID = U.[ID]
AND MR.ID_Regiao = R.uniqKey
AND PC.Data >= '2012-12-01 00:00:00' AND PC.Data <= '2012-12-31 23:59:59') AS PropostasComerciais,
(SELECT Count(*)
FROM PropostaDeLocacao PL
INNER JOIN Nomes N ON (PL.ClienteID = N.Codigo AND PL.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
WHERE PL.ResponsavelID = U.[ID]
AND MR.ID_Regiao = R.uniqKey
AND PL.Data >= '2012-12-01 00:00:00' AND PL.Data <= '2012-12-31 23:59:59') AS PropostasDeLocacao,
(SELECT Count(*)
FROM PedidosDeVenda PV
INNER JOIN Nomes N ON (PV.ClienteID = N.Codigo AND PV.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
WHERE PV.SolicitanteID = U.[ID]
AND MR.ID_Regiao = R.uniqKey
AND PV.Data >= '2012-12-01 00:00:00' AND PV.Data <= '2012-12-31 23:59:59') AS PedidosDeVenda,
(SELECT SUM(PVI.Valor)
FROM PedidosDeVenda PV
INNER JOIN Empresas N ON (PV.ClienteID = N.Codigo AND PV.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
INNER JOIN PedidosDeVendaXItens PVI ON PVI.PedidoDeVendaID = PV.[ID]
INNER JOIN Modelos M ON PVI.ProdutoID = M.[ID]
WHERE PV.SolicitanteID = U.[ID]
AND MR.ID_Regiao = R.uniqKey
AND PV.Data >= '2012-12-01 00:00:00' AND PV.Data <= '2012-12-31 23:59:59') As TotalPedidosDeVenda,
(SELECT SUM(PVI.Valor)
FROM PedidosDeVenda PV
INNER JOIN Nomes N ON (PV.ClienteID = N.Codigo AND PV.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
INNER JOIN PedidosDeVendaXItens PVI ON PVI.PedidoDeVendaID = PV.[ID]
INNER JOIN Modelos M ON PVI.ProdutoID = M.[ID]
WHERE PV.SolicitanteID = U.[ID]
AND N.TipoEmpresa = 'PU'
AND PV.ClienteID <> U.ClienteID
AND MR.ID_Regiao = R.uniqKey
AND PV.Data >= '2012-12-01 00:00:00' AND PV.Data <= '2012-12-31 23:59:59') As TotalVendasPublicas,
(SELECT SUM(PVI.Valor)
FROM PedidosDeVenda PV
INNER JOIN Nomes N ON (PV.ClienteID = N.Codigo AND PV.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
INNER JOIN PedidosDeVendaXItens PVI ON PVI.PedidoDeVendaID = PV.[ID]
INNER JOIN Modelos M ON PVI.ProdutoID = M.[ID]
WHERE PV.SolicitanteID = U.[ID]
AND N.TipoEmpresa = 'PR'
AND PV.ClienteID <> U.ClienteID
AND MR.ID_Regiao = R.uniqKey
AND PV.Data >= '2012-12-01 00:00:00' AND PV.Data <= '2012-12-31 23:59:59') As TotalVendasPrivadas,
(SELECT SUM(PVI.Valor)
FROM PedidosDeVenda PV
INNER JOIN Nomes N ON (PV.ClienteID = N.Codigo AND PV.SubCadastro = N.SubCadastro)
INNER JOIN Municipios_Regiao MR ON N.ID_Municipio = MR.ID_Municipio
INNER JOIN PedidosDeVendaXItens PVI ON PVI.PedidoDeVendaID = PV.[ID]
INNER JOIN Modelos M ON PVI.ProdutoID = M.[ID]
WHERE PV.SolicitanteID = U.[ID]
AND PV.ClienteID = U.ClienteID
AND MR.ID_Regiao = R.uniqKey
AND PV.Data >= '2012-12-01 00:00:00' AND PV.Data <= '2012-12-31 23:59:59') As TotalVendasProprias
FROM Usuarios U
INNER JOIN Regioes_Usuario RU ON U.[ID] = RU.ID_Usuario
INNER JOIN Regioes R ON RU.ID_Regiao = R.uniqKey
WHERE U.Representante = 64
ORDER BY R.Regiao, U.NomeCompleto;
有什么技巧可以使我的查詢變得越來越短?
您不應該在主查詢的選擇內部進行密集的嵌套查詢,因為我相信每次嵌套都會在外部連接發生時執行。
而是考慮聲明變量並首先分配這些變量。
喜歡
declare @outsidepredicate int, @Count1 int, @Count 2 int;
select @outsidepredicate = value from sharedtable for expressions
select @Count1 = count(*)
from table1 t (nolock)
join table2 tt (nolock) on t.idshared = tt.idshared
where outsidepredicatecolumn = @outsidepredicate
select @Count2 = count(*)
from table3 t (nolock)
join table4 tt (nolock) on t.idshared = tt.idshared
where outsidepredicatecolumn = @outsidepredicate
然后,您可以像這樣進行常規測試:
select
@Count1
, @Count2
, valuefrommain
from tableMain m (nolock)
join tableSide s (nolock) on m.idshared = s.idshared
因此,在深入查詢之后,我認為最佳的方法是減少對同一表的重新查詢。
如果有錯,請原諒拼寫錯誤。。。
嘗試這個:
SELECT
U.[ID] AS UniqKey,
U.NomeCompleto,
R.Regiao,
COUNT(O.ClientesID) Ocorrencias,
COUNT(F.ClienteID) FollowUps,
COUNT(P.SolicitanteID) PropostasComerciais,
COUNT(PL.ResponsavelID) PropostasDeLocacao,
COUNT(PV.SolicitanteID) PedidosDeVenda,
COUNT(PVTotal.SolicitanteID) TotalPedidosDeVenda,
SUM(PVTotalVendasPublicas.Valor) TotalVendasPublicas,
SUM(PVTotalVendasPrivadas.Valor) TotalVendasPrivadas,
SUM(PVTotalVendasProprias.Valor) TotalVendasProprias
FROM Usuarios U
JOIN Regioes_Usuario RU
ON U.[ID] = RU.ID_Usuario
JOIN Regioes R
ON RU.ID_Regiao = R.uniqKey
JOIN Municipios_Regiao MR
ON MR.ID_Regiao = R.uniqKey
LEFT JOIN Nomes N
ON N.ID_Municipio = MR.ID_Municipio
LEFT JOIN Ocorrencias O
ON O.ClientesID = N.Codigo
AND O.SubCadastro = N.SubCadastro
AND O.UsuariosID = U.[ID]
LEFT JOIN FollowUp F
ON F.SolicitanteID = U.[ID]
AND F.ClienteID = N.Codigo
AND F.SubCadastro = N.SubCadastro
LEFT JOIN v_PropostaComercial PC
ON PC.SolicitanteID = U.[ID]
AND PC.ClienteID = N.Codigo
AND PC.SubCadastro = N.SubCadastro
LEFT JOIN PropostaDeLocacao PL
ON PL.ResponsavelID = U.[ID]
AND PL.ClienteID = N.Codigo
AND PL.SubCadastro = N.SubCadastro
LEFT JOIN PedidosDeVenda PV
ON PV.SolicitanteID = U.[ID]
AND PV.ClienteID = N.Codigo
AND PV.SubCadastro = N.SubCadastro
LEFT JOIN PedidosDeVenda PVTotal
ON PVTotal.SolicitanteID = U.[ID]
JOIN PedidosDeVendaXItens PVI
ON PVI.PedidoDeVendaID = PVTotal.[ID]
JOIN Modelos M
ON PVI.ProdutoID = M.[ID]
JOIN Empresas N1
ON PVTotal.ClienteID = N1.Codigo
AND PVTotal.SubCadastro = N1.SubCadastro
LEFT JOIN Municipios_Regiao MRTotal
ON R.uniqKey = MRTotal.ID_Regiao
AND N1.ID_Municipio = MRTotal.ID_Municipio
LEFT JOIN PedidosDeVenda PVTotalVendasPublicas
ON PVTotalVendasPublicas.SolicitanteID = U.[ID]
AND PVPVTotalVendasPublicas.ClienteID <> U.ClienteID
AND PVTotalVendasPublicas.ClienteID = N.Codigo
AND PVTotalVendasPublicas.SubCadastro = N.SubCadastro
AND N.ID_Municipio = MR.ID_Municipio
AND N.TipoEmpresa = 'PU'
JOIN PedidosDeVendaXItens PVI
ON PVI.PedidoDeVendaID = PVTotalVendasPublicas.[ID]
JOIN Modelos M
ON PVI.ProdutoID = M.[ID]
LEFT JOIN PedidosDeVenda PVTotalVendasPrivadas
ON PVTotalVendasPrivadas.SolicitanteID = U.[ID]
AND PVTotalVendasPrivadas.ClienteID <> U.ClienteID
AND PVTotalVendasPrivadas.ClienteID = N.Codigo
AND PVTotalVendasPrivadas.SubCadastro = N.SubCadastro
AND N.TipoEmpresa = 'PR'
JOIN PedidosDeVendaXItens PVI
ON PVI.PedidoDeVendaID = PVTotalVendasPrivadas.[ID]
JOIN Modelos M
ON PVI.ProdutoID = M.[ID]
LEFT JOIN PedidosDeVenda PVTotalVendasProprias
ON PVTotalVendasProprias.SolicitanteID = U.[ID]
AND PVTotalVendasProprias.ClienteID = U.ClienteID
AND PVTotalVendasProprias.ClienteID = N.Codigo
AND PVTotalVendasProprias.SubCadastro = N.SubCadastro
JOIN PedidosDeVendaXItens PVI
ON PVI.PedidoDeVendaID = PVTotalVendasProprias.[ID]
JOIN Modelos M
ON PVI.ProdutoID = M.[ID]
WHERE U.Representante = 64
AND O.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
AND F.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
AND PC.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
AND PL.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
AND PV.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
AND PVTotal.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
AND PVTotalVendasPublicas.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
AND PVTotalVendasPrivadas.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
AND PVTotalVendasProprias.Data BETWEEN '2012-12-01 00:00:00' AND '2012-12-31 23:59:59'
GROUP BY U.ID, U.NameCompleto, R.Regiao
ORDER BY R.Regiao, U.NomeCompleto;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.