Fórum Consulta SQL #215588

20/02/2004

0

Tenho o seguinte:

Tabela1 = armazeno saldos encerrados em um periodo(ex.: 2003)
campos: item, cor, tamanho, estoque

Tabela2 = movimento dos itens.
campos: item, cor, tamanho, qtd, tipomovimento, datamovimento

O que eu queria é o seguinte:

Concatenar, juntar as duas tabelas, e classificar a Tabela1 agrupando por
item, cor, tamanho somando o campo estoque.

e a tabela2 agrupar por item, cor, tamanho somando o campo qtd
quando o tipomovimento=´S´ e somando separadamente o campo qtd
quando o tipomovimento=´E´.

O que eu fiz foi o seguinte e deu certo

´Select item, cor, tamanho, sum(qtd) as qtd from Tabela2 where df is null and
datamovimento beetween datai and dataf group by item, cor, tamanho´

Fiz o básico, mas não é isso que eu quero.

Tentei várias outras maneiras, inclusive usando subselect, left join, inner join mas
sempre me retorna uma mensagem indesejada.

Como posso fazer para ter esse resultado?



Desde já agradeço!!!!!

José. :D


Ejose

Ejose

Responder

Posts

20/02/2004

Paulo_amorim

Olá

Que tal usar UNION?

eu fiz um aqui que parece funcional...aqui tem a ideia, vc adapta ao teu programa...
dependendo do banco, vc vai precisar por um AS DADOS logo apos os parenteses da SUBQUERY (dar um nome a ela)


SELECT item, cor, tamanho, SUM(estoque), SUM(qtd) 
FROM(
SELECT item, cor, tamanho, SUM(estoque) estoque, NULL qtd FROM Tabela1
GROUP BY item, cor, tamanho

UNION

SELECT item, cor, tamanho, NULL estoque, SUM(qtd) qtd FROM Tabela2
GROUP BY item, cor, tamanho
) /* aqui vc poe teu nome, se necessario */

GROUP BY item, cor, tamanho


Isso deve funcionar...em Oracle e SQL Server, isso basta!
Até+


Responder

Gostei + 0

20/02/2004

Ejose

Olá!!!

Em primeiro, Agradeço muito a atenção!!


Esta é a minha consulta na íntegra:


wconsulta := ´Select iditem, iditemcla, iditemtam, iditemdep, id2, sum(estoque), sum(qtd) FROM (´;
wconsulta := wconsulta + ´Select iditem, iditemcla, iditemtam, iditemdep, id2, SUM(estoque) Estoque, NULL qtd FROM EANTERIOR WHERE df is null and empresa=´ + sEmpresa[0] + ´ Group by iditem, iditemcla, iditemtam, iditemdep, id2´;
wconsulta := wconsulta + ´ UNION ´;
wconsulta := wconsulta + ´Select iditem, iditemcla, iditemtam, iditemdep, id2, NULL Estoque, SUM(qtd) qtd FROM EMOVIMENTO WHERE df is null and empresa=´ + sEmpresa[0] + ´ and datal between ´ +#39+datamovi+39+ ´ and ´+39+datamovf+39 + ´ and mov=´ +39+wmove+39 + ´ Group by iditem, iditemcla, iditemtam, iditemdep, id2´;
wconsulta := wconsulta + ´) as Tabdados Group by iditem, iditemcla, iditemtam, iditemdep, id2´;


Me retorna o seguinte erro:
Token unknown - line 1, char 82 Select

Mudei tudo o que podia, mas não deu resultado.


Responder

Gostei + 0

20/02/2004

Sremulador

amigo pegue os dados e aplique diretamente sobre a query e veja se esta dando erro também.


Responder

Gostei + 0

21/02/2004

Ejose

Olá!!


Obrigado pela dica

:D
Ocorreu o mesmo erro.

Será que o problema não é de sintaxe, da maneira como estou usando o Select?



José.


Responder

Gostei + 0

21/02/2004

Everton

José, criei uma tabela com os campos que você disse ter em suas tabelas para fazer um teste. Pelo que entendi você quer ter em um select, o total de produtos que entraram e que saíram em um determinado período, agrupados pelo item, a cor e o tamanho. Fiz um teste e acho que o SQL abaixo é o que você precisa.


select T1.Item, T1.Cor, T1.Tamanho, sum(T1.estoque) as Estoque,
(select sum(T2.qtd) from TABELA2 T2
where T1.item = T2.item
and T1.cor = T2.cor
and T1.tamanho = T2.tamanho
and T2.tipomovimento = ´E´
and T2.datamovimento >=:DataInicial
and T2.datamovimento <=:DataFinal) as Entrada,
(select sum(T2.qtd) from TABELA2 T2
where T1.item = T2.item
and T1.cor = T2.cor
and T1.tamanho = T2.tamanho
and T2.tipomovimento = ´S´
and T2.datamovimento >=:DataInicial
and T2.datamovimento <=:DataFinal) as Saida
from TABELA1 T1
group by T1.Item, T1.Cor, T1.Tamanho


Espero que seja isto que esteja procurando.

[].


Responder

Gostei + 0

21/02/2004

Ejose

Olá!!
:D
Everton, a sua dica funcionou certinho. Obrigado pela sua atenção!!
Só que não mostrou o que está em * na explicação abaixo.
Tentei fazer algumas mudanças no código, mas não resolveu.

Tabela1 - Estoques encerrado em 31/12/2003

Item cor tamanho estoque
159 159 G 20
159 159 P 10
159 159 12 1
159 100 G 10

Tabela2 - Movimento período: 01/01/2004 à 20/02/2004

Item cor tamanho qtd tipomovimento
159 159 G 10 E
159 159 G 5 S
159 159 G 2 S
159 159 G 5 S
159 159 M 50 E ****

A consulta deveria mostrar:

Item cor tamanho estoque Entradas Saidas
159 159 G 20 10 12
159 159 P 10 0 0
159 159 12 1 0 0
159 100 G 10 0 0
159 159 M 0 50 0 ****

**** Observe que o movimento não se encontra na Tabela1(saldo anterior).

- A minha tabela de itens eu só cadastro o Item ex.: 159 - BÁSICA FEMININA
a Cor e o tamanho, eu tenho tabelas, mas eu só controlo em movimento.
- Tenho Sistema assim em Clipper.
Claro, que existe muito mais coisas, como custos, outros, mas se
conseguir resolver isso será 99¬.

Obrigado!!!

José.


Responder

Gostei + 0

21/02/2004

Everton

e aí José, blz ? Dê uma olhada nesse SQL. Deu certinho para os exemplos que você apresentou.

SELECT T2.ITEM, T2.COR, T2.TAMANHO,
(SELECT SUM(T1.ESTOQUE) FROM tabela1 T1
WHERE T1.ITEM = T2.ITEM
AND T1.COR = T2.COR
AND T1.TAMANHO = T2.TAMANHO) AS ESTOQUE,
(SELECT SUM(T3.QTD) FROM tabela2 T3
WHERE T3.TIPOMOVIMENTO = ´E´
AND T3.ITEM = T2.ITEM
AND T3.COR = T2.COR
AND T3.TAMANHO = T2.TAMANHO) AS ENTRADA,
(SELECT SUM(T4.QTD) FROM tabela2 T4
WHERE T4.TIPOMOVIMENTO = ´S´
AND T4.ITEM = T2.ITEM
AND T4.COR = T2.COR
AND T4.TAMANHO = T2.TAMANHO) AS SAIDA
FROM TABELA2 T2
UNION
SELECT T1.ITEM, T1.COR, T1.TAMANHO,
(SELECT SUM(T2.ESTOQUE) FROM tabela1 T2
WHERE T2.ITEM = T1.ITEM
AND T2.COR = T1.COR
AND T2.TAMANHO = T1.TAMANHO) AS ESTOQUE,
(SELECT SUM(T3.QTD) FROM tabela2 T3
WHERE T3.TIPOMOVIMENTO = ´E´
AND T3.ITEM = T1.ITEM
AND T3.COR = T1.COR
AND T3.TAMANHO = T1.TAMANHO) AS ENTRADA,
(SELECT SUM(T4.QTD) FROM tabela2 T4
WHERE T4.TIPOMOVIMENTO = ´S´
AND T4.ITEM = T1.ITEM
AND T4.COR = T1.COR
AND T4.TAMANHO = T1.TAMANHO) AS SAIDA
FROM TABELA1 T1


Espero que dessa vez dê certo. [].


Responder

Gostei + 0

25/02/2004

Ejose

Olá!!!

DEU CERTO!!!!!!!!!!! :D

OBRIGADO!!!!!!!!!!

A única diferença que ajustei foi depois do UNION, o alias T2 retornou
erro que estava duplicado ou parecido, daí mudei para outro nome e funcionou.

Minha consulta ficou mais ou menos assim:

wconsulta := ´Select T2.Iditem, T2.Iditemcla, T2.Iditemtam, T2.Iditemdep, T2.Id2, T9.Iditem, T9.Descricao, ´;
wconsulta := wconsulta + ´(Select sum(T1.estoque) from EANTERIOR T1 ´;
wconsulta := wconsulta + ´WHERE T1.df is null and T1.empresa>=´ + sEmpresa[0] + ´ and T1.empresa<=´+ sEmpresa[1] +´ and ´;
wconsulta := wconsulta + ´T1.Exercicio = ´+#39+Exercicio+39+´ and ´;
wconsulta := wconsulta + ´T1.Balanco = ´+39+Balanco+39+´ and ´;
wconsulta := wconsulta + ´T1.Iditem = T2.Iditem and ´;
wconsulta := wconsulta + ´T1.Iditemcla = T2.Iditemcla and ´;
wconsulta := wconsulta + ´T1.Iditemtam = T2.Iditemtam and ´;
wconsulta := wconsulta + ´T1.Iditemdep = T2.Iditemdep and ´;
wconsulta := wconsulta + ´T1.Id2 = T2.Id2) as Estoque, ´;

wconsulta := wconsulta + ´(Select sum(T3.qtd) from EMOVITEM T3 ´;
wconsulta := wconsulta + ´WHERE T3.df is null and ´;
wconsulta := wconsulta + ´T3.empresa>=´ + sEmpresa[0] + ´ and T3.empresa<=´+ sEmpresa[1] + ´ and ´;
wconsulta := wconsulta + ´T3.datal between ´ +#39+datamovi+39+ ´ and ´+39+datamovf+39 + ´ and ´;
wconsulta := wconsulta + ´T3.mov=´ +39+wmovE+39 + ´ and ´;
wconsulta := wconsulta + ´T3.Iditem = T2.Iditem and ´;
wconsulta := wconsulta + ´T3.Iditemcla = T2.Iditemcla and ´;
wconsulta := wconsulta + ´T3.Iditemtam = T2.Iditemtam and ´;
wconsulta := wconsulta + ´T3.Iditemdep = T2.Iditemdep and ´;
wconsulta := wconsulta + ´T3.Id2 = T2.Id2) as Entradas, ´;

wconsulta := wconsulta + ´(Select sum(T4.qtd) from EMOVITEM T4 ´;
wconsulta := wconsulta + ´WHERE T4.df is null and ´;
wconsulta := wconsulta + ´T4.empresa>=´ + sEmpresa[0] + ´ and T4.empresa<=´+ sEmpresa[1] + ´ and ´;
wconsulta := wconsulta + ´T4.datal between ´ +#39+datamovi+39+ ´ and ´+39+datamovf+39 + ´ and ´;
wconsulta := wconsulta + ´T4.mov=´ +39+wmovS+39 + ´ and ´;
wconsulta := wconsulta + ´T4.Iditem = T2.Iditem and ´;
wconsulta := wconsulta + ´T4.Iditemcla = T2.Iditemcla and ´;
wconsulta := wconsulta + ´T4.Iditemtam = T2.Iditemtam and ´;
wconsulta := wconsulta + ´T4.Iditemdep = T2.Iditemdep and ´;
wconsulta := wconsulta + ´T4.Id2 = T2.Id2) as Saidas ´;
wconsulta := wconsulta + ´FROM EMOVITEM T2, EITEMA T9 WHERE ´;
wconsulta := wconsulta + ´T2.Iditem = T9.Iditem and T2.id2 >= ´+39+wid2i+39+ ´ and T2.id2 <= ´+39+wid2f+39;
if Iditemtam <> ´´ then begin
wconsulta := wconsulta + ´ and T2.Iditemtam = ´+39+iditemtam+39;
end;

wconsulta := wconsulta + ´ UNION ´;

wconsulta := wconsulta + ´Select T1.Iditem, T1.Iditemcla, T1.Iditemtam, T1.Iditemdep, T1.Id2, T8.Iditem, T8.Descricao, ´;
wconsulta := wconsulta + ´(Select sum(T5.estoque) from EANTERIOR T5 ´;
wconsulta := wconsulta + ´WHERE T5.df is null and T5.empresa>=´ + sEmpresa[0] + ´ and T2.empresa<=´+ sEmpresa[1] +´ and ´;
wconsulta := wconsulta + ´T5.Exercicio = ´+#39+Exercicio+39+´ and ´;
wconsulta := wconsulta + ´T5.Balanco = ´+39+Balanco+39+´ and ´;
wconsulta := wconsulta + ´T5.Iditem = T1.Iditem and ´;
wconsulta := wconsulta + ´T5.Iditemcla = T1.Iditemcla and ´;
wconsulta := wconsulta + ´T5.Iditemtam = T1.Iditemtam and ´;
wconsulta := wconsulta + ´T5.Iditemdep = T1.Iditemdep and ´;
wconsulta := wconsulta + ´T5.Id2 = T1.Id2) as Estoque, ´;

wconsulta := wconsulta + ´(Select sum(T3.qtd) from EMOVITEM T3 ´;
wconsulta := wconsulta + ´WHERE T3.df is null and ´;
wconsulta := wconsulta + ´T3.empresa>=´ + sEmpresa[0] + ´ and T3.empresa<=´+ sEmpresa[1] + ´ and ´;
wconsulta := wconsulta + ´T3.datal between ´ +#39+datamovi+39+ ´ and ´+39+datamovf+39 + ´ and ´;
wconsulta := wconsulta + ´T3.mov=´ +39+wmovE+39 + ´ and ´;
wconsulta := wconsulta + ´T3.Iditem = T1.Iditem and ´;
wconsulta := wconsulta + ´T3.Iditemcla = T1.Iditemcla and ´;
wconsulta := wconsulta + ´T3.Iditemtam = T1.Iditemtam and ´;
wconsulta := wconsulta + ´T3.Iditemdep = T1.Iditemdep and ´;
wconsulta := wconsulta + ´T3.Id2 = T1.Id2) as Entradas, ´;

wconsulta := wconsulta + ´(Select sum(T4.qtd) from EMOVITEM T4 ´;
wconsulta := wconsulta + ´WHERE T4.df is null and ´;
wconsulta := wconsulta + ´T4.empresa>=´ + sEmpresa[0] + ´ and T4.empresa<=´+ sEmpresa[1] + ´ and ´;
wconsulta := wconsulta + ´T4.datal between ´ +#39+datamovi+39+ ´ and ´+39+datamovf+39 + ´ and ´;
wconsulta := wconsulta + ´T4.mov=´ +39+wmovS+39 + ´ and ´;
wconsulta := wconsulta + ´T4.Iditem = T1.Iditem and ´;
wconsulta := wconsulta + ´T4.Iditemcla = T1.Iditemcla and ´;
wconsulta := wconsulta + ´T4.Iditemtam = T1.Iditemtam and ´;
wconsulta := wconsulta + ´T4.Iditemdep = T1.Iditemdep and ´;
wconsulta := wconsulta + ´T4.Id2 = T1.Id2) as Saidas ´;
wconsulta := wconsulta + ´FROM EANTERIOR T1, EITEMA T8 WHERE ´;
wconsulta := wconsulta + ´T1.Iditem = T8.Iditem and T1.id2 >= ´+39+wid2i+39+ ´ and T1.id2 <= ´+39+wid2f+39;
if Iditemtam <> ´´ then begin
wconsulta := wconsulta + ´ and T1.Iditemtam = ´+39+Iditemtam+39;
end;


José.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar