簡體   English   中英

SQL Server-具有相同WHERE子句的多個表中的多個計數

[英]SQL Server - Multiple Counts from multiple tables with the same WHERE clause

我需要來自多個表的多個計數,但是所有表都與同一個表連接,並具有相同的where子句。 我得到了正確的結果,但是,在一個非常大而緩慢的查詢中,並且,我想學習如何改善這一點。

我必須從表中計數:

  • Ocorrencias
  • 后續行動
  • 美洲前鋒
  • 羅馬教皇
  • 佩迪多斯·德文達斯

還有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM