TransWikia.com

Vários Select Sum com parametros de tabelas relacionadas

Stack Overflow em Português Asked by ale_moraes on November 10, 2021

Tentei fazer uma consulta SubSelect quando um usuario quiser pesquisar o Patrimônio por Produto, por Localização e por Situação o Total da soma seja alterada. E ele só soma o Patrimônio em que Ativo = true. Segue o comando Sql que fiz. Por favor, peço ajuda.

SELECT USUARIO.[usu_codigo], Sum(IIF(PATRIMONIO.[pat_ativo] = true, (PATRIMONIO.[pat_valortotal]), 0)) As Soma,  
    (SELECT Sum(IIF(PATRIMONIO.[pat_ativo] = true, (PATRIMONIO.[pat_valortotal]), 0)) WHERE PATRIMONIO.[pat_codproduto] = PRODUTO.[prod_codigo] And ((PRODUTO.[prod_nome]) = ?)) As SomaProduto, 
    (SELECT Sum(IIF(PATRIMONIO.[pat_ativo] = true, (PATRIMONIO.[pat_valortotal]), 0)) WHERE PATRIMONIO.[pat_codlocalizacao] = LOCALIZACAO.[loc_codigo] And ((LOCALIZACAO.[loc_nome]) = ?)) As SomaLocalizacao,  
    (SELECT Sum(IIF(PATRIMONIO.[pat_ativo] = true, (PATRIMONIO.[pat_valortotal]), 0)) WHERE PATRIMONIO.[pat_codlocalizacao] = PATRIMONIO.[pat_situacao] And ((PATRIMONIO.[pat_situacao]) = ?)) As SomaSituacao  
FROM USUARIO, PATRIMONIO, PRODUTO, LOCALIZACAO 
GROUP BY USUARIO.[usu_codigo], PRODUTO.[prod_nome], LOCALIZACAO.[loc_nome], PATRIMONIO.[pat_situacao] 
HAVING(((USUARIO.[usu_codigo]) = ?));

One Answer

Funcionou desse jeito, não sei como vai ficar em termo de performance. Alguém tem alguma sugestão para simplificar este select?

SELECT DISTINCT * FROM (SELECT USUARIO.[usu_codigo], Sum(IIF(PATRIMONIO.[pat_ativo] = true, (PATRIMONIO.[pat_valortotal]), 0)) FROM USUARIO LEFT JOIN PATRIMONIO ON USUARIO.[usu_codigo] = PATRIMONIO.[pat_codusuario] GROUP BY USUARIO.[usu_codigo] HAVING(((USUARIO.[usu_codigo]) = ?)) UNION ALL SELECT PRODUTO.[prod_nome], Sum(IIF(PATRIMONIO.[pat_ativo] = true, (PATRIMONIO.[pat_valortotal]), 0)) FROM PRODUTO LEFT JOIN PATRIMONIO ON PRODUTO.[prod_codigo] = PATRIMONIO.[pat_codproduto] GROUP BY PRODUTO.[prod_nome] HAVING(((PRODUTO.[prod_nome]) = ?)) UNION ALL SELECT LOCALIZACAO.[loc_codigo], Sum(IIF(PATRIMONIO.[pat_ativo] = true, (PATRIMONIO.[pat_valortotal]), 0)) FROM LOCALIZACAO LEFT JOIN PATRIMONIO ON LOCALIZACAO.[loc_codigo] = PATRIMONIO.[pat_codlocalizacao] GROUP BY LOCALIZACAO.[loc_codigo] HAVING(((LOCALIZACAO.[loc_codigo]) = ?)) UNION ALL SELECT PATRIMONIO.[pat_situacao], Sum(IIF(PATRIMONIO.[pat_ativo] = true, (PATRIMONIO.[pat_valortotal]), 0)) FROM PATRIMONIO GROUP BY PATRIMONIO.[pat_situacao] HAVING(((PATRIMONIO.[pat_situacao]) = ?)));

Answered by ale_moraes on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP