Duvida SQL ( Agora complicou )!

8 respostas
Z

Eu não sei onde posso postar sobre duvida sql, me desculpem, entretanto eu estou empacado nisso e não consigo dar continuidade no projeto.

Gostaria de saber se alguem manja mto e possa me ajudar

Pois…

AGORA COMPLICOU !

Tenho uma Sql que traz a a qtd de reducao e o valor de cada uma

Veja a sql

SELECT [_m_cad_tipo_medida].descricao, [_m_cad_recudao_preco].valor AS valorx, Sum([_m_sub_pedido_item_modulo_produtos].quantidade) AS SomaDequantidade, [_m_cad_categorias].descricao AS categoria, [_m_cad_recudao_preco].sub_categoria, [_m_sub_pedido_item_modulo].cod_sub_pedido_item AS cod_item

FROM (_m_cad_tipo_medida INNER JOIN (_m_cad_categorias INNER JOIN _m_cad_recudao_preco ON [_m_cad_categorias].cod = [_m_cad_recudao_preco].categoria) ON [_m_cad_tipo_medida].cod = [_m_cad_recudao_preco].tipo) INNER JOIN (_m_cad_produtos INNER JOIN (_m_sub_pedido_item_modulo INNER JOIN _m_sub_pedido_item_modulo_produtos ON [_m_sub_pedido_item_modulo].cod = [_m_sub_pedido_item_modulo_produtos].cod_modulo) ON [_m_cad_produtos].cod = [_m_sub_pedido_item_modulo_produtos].cod_produto) ON [_m_cad_categorias].cod = [_m_cad_produtos].categoria

GROUP BY [_m_cad_tipo_medida].descricao, [_m_cad_recudao_preco].valor, [_m_cad_categorias].descricao, [_m_cad_recudao_preco].sub_categoria, [_m_sub_pedido_item_modulo].cod_sub_pedido_item, [_m_sub_pedido_item_modulo].cod_pedido, [_m_sub_pedido_item_modulo_produtos].corte_largura, [_m_cad_recudao_preco].validade

HAVING ((([_m_cad_tipo_medida].descricao)=‘LARGURA’) AND (([_m_cad_recudao_preco].valor)<>0) AND (([_m_cad_recudao_preco].sub_categoria) Is Null) AND (([_m_sub_pedido_item_modulo].cod_pedido)=1597) AND (([_m_sub_pedido_item_modulo_produtos].corte_largura)>0) AND (([_m_cad_recudao_preco].validade)>=#10/8/2009#));

O problema é o seguinte, na tabela de reducao pode haver por exemplo :

cod_______categoria__________tipo__________valor____validade
1_________Prateleira__________Largura_______23______09/10/2009
1_________Prateleira__________Largura_______55______14/10/2009

Isso quer dizer que… até o dia 9 a reducao de uma prateleira é de 23 reais… apos dia 14 é 55 reais

No caso esta retornando o seguinte resultado(errado pois tem 1 linhas a mais ):

descricao_________valorx________somadequantidade_______categoria________validade
LARGURA_____________23_________________1____________PRATELEIRAS 457______9/10/2009
LARGURA_____________55_________________1____________PRATELEIRAS 457______14/10/2009

Se o pedido tem data de 08/10/2009 e na Sql eu coloquei o parametro de >=#08/10/2009# ele trará 2 registro !!

Eu não posso usar o “Top” pois ele me retornará somente a 1 linha… mas como esta sql mostra reducao de todos os produtos não iria funcionar.

Sendo que eu preciso que considere apenas o 1, isto é o valor em que a data é a mais prox…

=X

entenderam o problema?

Muito Obrigado pela ajuda

Smp Grt,

8 Respostas

leo_amorim

Poste a Query que você tentou que eu tento te ajudar

Z

esta ai no post amigo… a 1 query…

"SELECT [_m_cad_tipo_medida].descricao, [_m_cad_recudao_preco].valor AS valorx, Sum([_m_sub_pedido_item_modulo_produtos].quantidade) AS SomaDequantidade, [_m_cad_categorias].descricao AS categoria, [_m_cad_recudao_preco].sub_categoria, [_m_sub_pedido_item_modulo].cod_sub_pedido_item AS cod_item

FROM (_m_cad_tipo_medida INNER JOIN (_m_cad_categorias INNER JOIN _m_cad_recudao_preco ON [_m_cad_categorias].cod = [_m_cad_recudao_preco].categoria) ON [_m_cad_tipo_medida].cod = [_m_cad_recudao_preco].tipo) INNER JOIN (_m_cad_produtos INNER JOIN (_m_sub_pedido_item_modulo INNER …

"…

M

Você pode resolver isso utilizando uma subquery que some as quantidades daquele produto usando o mesmo parametro de data mas agrupando somente por produto.
Não consigo entender porque somar a quantidade e desconsiderar o valor sendo que cada qtd de produto terá valor diferente, mas se você fizer essa subquery acredito que irá resolver seu problema.=D

Z

voce não entendeu

É o mesmo produto… só que o valor da reducao dele foi alterado !!! ficou mais caro no caso…

É importante eu desenvolver a sql que traga a data valida do valor…

Pq se eu quiser consultar os pedidos antigos…terao os valores antigos entendeu ? só usando parametro <=data_do_pedido…

Eu ouvi falar que o MAX resolveria pois traz o maior entre 2 registro…ou o menor ( MIN ) TANTO faz… mas ue não consigo usa-los =x

M

pelo que vi você só utiliza a tabela [_m_sub_pedido_item_modulo_produtos] para obter a quantidade, então acredito que uma subquery do tipo:

SELECT
[_m_cad_tipo_medida].descricao,
[_m_cad_recudao_preco].valor AS valorx,
(select
sum([_m_sub_pedido_item_modulo_produtos].quantidade)
from
[_m_sub_pedido_item_modulo_produtos]
where
[_m_sub_pedido_item_modulo].cod = [_m_sub_pedido_item_modulo_produtos].cod_modulo) AS SomaDequantidade,
[_m_cad_categorias].descricao AS categoria,
[_m_cad_recudao_preco].sub_categoria,
[_m_sub_pedido_item_modulo].cod_sub_pedido_item AS cod_item …

Resolveria. Tirando a tabela do from e colocando somente na subquery.
o uso do MIN ou MAX seria possível também utilizando subquery, porém acredito que não seja necessário. Eu particularmente tento evitar isso pra não prejudicar a performance.
Será que dessa forma resolve?

M

Ops, mais uma alteração.
Realmente vc vai precisar usar um mim.
Precisa fazer uma subquery trazendo a tabela

[_m_cad_recudao_preco].validade) com a restrição de >=#10/8/2009#
Aí por fora você pode fazer um MIM nessa data para obter só a primeira data após 10/08/2009.
isso?

Z

marialvo de fato preciso do “MIN”… mas não consigo entender sua solucao…

poderia ser mais claro?

Obrigado por ate agora !!

Mto grato

sds

M
rsrs desculpe eu sou enrolado pra caramba mesmo eu tava pensando em algo do tipo:

HAVING ((([_m_cad_tipo_medida].descricao)=LARGURA) AND (([_m_cad_recudao_preco].valor)<>0) AND (([_m_cad_recudao_preco].sub_categoria) Is Null) AND (([_m_sub_pedido_item_modulo].cod_pedido)=1597) AND (([_m_sub_pedido_item_modulo_produtos].corte_largura)>0) AND (SELECT

MIN(reducao2.validade) AS validade

FROM

[_m_cad_recudao_preco] as reducao2

WHERE

reducao2.categoria =[_m_cad_recudao_preco].categoria AND

reducao2.tipo) = [_m_cad_recudao_preco].tipo) AND

reducao2.sub_categoria = [_m_cad_recudao_preco].sub_categoria AND

(reducao2.validade>=#10/8/2009#) AND

(reducao2.valor<>0) AND

(reducao2.sub_categoria Is Null))

);

assim ao invés de filtrar por um período, já estaria filtrando direto pela menor data apartir de 10/8/2009.
Não sei se entendi direito a sua necessidade agora…

Criado 15 de outubro de 2009
Ultima resposta 15 de out. de 2009
Respostas 8
Participantes 3