[firebase-br] Dados cruzados. Como fazer?

Felipe Giotto felipe em metasoftware.com.br
Seg Set 12 16:12:18 -03 2005


Não testei aqui pois não estou com muito tempo ;-) , mas isso pode 
funcionar, desde que você realmente só possua os tipos 1, 2, 3 e 4...

SELECT STATUS,
( SELECT COUNT(TIPO) FROM TABELA T2 WHERE T2.TIPO=1 AND 
T2.STATUS=T1.STATUS) AS T1,
( SELECT COUNT(TIPO) FROM TABELA T2 WHERE T2.TIPO=2 AND 
T2.STATUS=T1.STATUS) AS T2,
( SELECT COUNT(TIPO) FROM TABELA T2 WHERE T2.TIPO=3 AND 
T2.STATUS=T1.STATUS) AS T3,
( SELECT COUNT(TIPO) FROM TABELA T2 WHERE T2.TIPO=4 AND 
T2.STATUS=T1.STATUS) AS T4
FROM TABELA T1
GROUP BY STATUS

Isso não é muito otimizado por causa dos vários subselects, mas é uma 
solução rápida e "simples" caso você não possua muitos dados.... Como eu 
não pude testar, caso não dê certo, poste o erro que eu criarei uma 
tabela parecida e testarei melhor o SELECT!!

Espero ter ajudado,

Felipe Giotto ;-)




marcelo - teflamar wrote:

>segue um exemplo com clientdataset
>
>estrutura da tabela:
>cod,cliente, data,     status,tipo
>1   1       01/09/2004 ab     1
>2   1       01/09/2004 ac     1
>3   2       02/09/2004 aj     2
>4   2       02/09/2004 ab     2
>5   3       03/09/2004 ac     2
>6   3       03/09/2004 ac     3
>7   3       03/09/2004 aj     4
>8   1       03/09/2004 dm     2
>9   1       01/09/2004 dm     1
>10  1       01/09/2004 dm     1
>
>tipo  |1 | 2 |3 | 4 |total
>------+--+---+--+---+-----+
>ab    |1 | 1 |0 | 0 |  2
>ac    |1 | 1 |1 | 0 |  3
>aj    |0 | 1 |0 | 1 |  2
>dm    |2 | 1 |0 | 0 |  3
>total |4 | 4 |1 | 1 | 10
>
>objetos:
>1 clientdataset
>1 datasource
>1 database
>1 transaction
>3 ibquery
>query1 - seleciona as colunas distintas
>query2 - seleciona as linhas distintas
>query3 - é a query de trabalho,
>* as querys podem ser substituidas
>por isql, mais rápidas.
>//--------------------------------------------
>procedure TForm1.Button1Click(Sender: TObject);
>begin
>clientdataset1.Close;
>clientdataset1.fielddefs.Clear;
>ibdatabase.connected:=true;
>ibtransaction1.starttransaction;
>ibquery1.sql.text:='select distinct status from tabela where data between :datai and :dataf and cliente=:cliente';
>ibquery1.parambyname('cliente').asinteger:=strtoint(edcli.text);
>ibquery1.parambyname('datai').asdatetime:=strtodate(eddatai.text);
>ibquery1.parambyname('dataf').asdatetime:=strtodate(eddataf.text);
>ibquery1.open;
>clientdataset1.FieldDefs.Add('tipo',ftstring,10,true);
>clientdataset1.IndexFieldNames:='tipo';
>while not ibquery1.eof do
>begin
>clientdataset1.FieldDefs.Add(ibquery1.fieldbyname('status').asstring,ftinteger,0,false);
>ibquery1.next;
>end;
>clientdataset1.FieldDefs.Add('total',ftinteger,0,false);
>clientdataset1.CreateDataSet;
>clientdataset1.Append;
>clientdataset1.fieldbyname('tipo').asstring:='ZZtotal';
>ibquery2.close;
>ibquery2.sql.text:='select distinct tipo from tabela where data between :datai and :dataf and cliente=:cliente';
>ibquery2.parambyname('cliente').asinteger:=strtoint(edcli.text);
>ibquery2.parambyname('datai').asdatetime:=strtodate(eddatai.text);
>ibquery2.parambyname('dataf').asdatetime:=strtodate(eddataf.text);
>ibquery2.open;
>while not ibquery2.eof do
>begin
>clientdataset1.Append;
>clientdataset1.fieldbyname('tipo').asstring:=ibquery2.fieldbyname('tipo').asstring;
>ibquery1.First;
>while not ibquery1.Eof do
>begin
>ibquery3.Close;
>ibquery3.SQL.text:='select count(*) as qtd from tabela where tipo=:tipo and status=:status and cliente=:cliente and data between :datai and :dataf';
>ibquery3.parambyname('cliente').asinteger:=strtoint(edcli.text);
>ibquery3.parambyname('datai').asdatetime:=strtodate(eddatai.text);
>ibquery3.parambyname('dataf').asdatetime:=strtodate(eddataf.text);
>ibquery3.parambyname('tipo').asstring:=ibquery2.fieldbyname('tipo').asstring;
>ibquery3.parambyname('status').asstring:=ibquery1.fieldbyname('status').asstring;
>ibquery3.open;
>clientdataset1.findkey([ibquery2.fieldbyname('tipo').asstring]);
>clientdataset1.edit;
>clientdataset1.fieldbyname(ibquery1.fieldbyname('status').asstring).asinteger:=ibquery3.fieldbyname('qtd').asinteger;
>clientdataset1.fieldbyname('total').asinteger:=clientdataset1.fieldbyname('total').asinteger + ibquery3.fieldbyname('qtd').asinteger;
>clientdataset1.findkey(['ZZtotal']);
>clientdataset1.Edit;
>clientdataset1.fieldbyname(ibquery1.fieldbyname('status').asstring).asinteger:=
>clientdataset1.fieldbyname(ibquery1.fieldbyname('status').asstring).asinteger +
>ibquery3.fieldbyname('qtd').asinteger;
>clientdataset1.fieldbyname('total').asinteger:=clientdataset1.fieldbyname('total').asinteger + ibquery3.fieldbyname('qtd').asinteger;
>ibquery1.next;
>end;
>ibquery2.next;
>end;
>ibtransaction1.Commit;
>end;
>//--- marcelo luiz stefaniak
>______________________________________________
>FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>  
>





Mais detalhes sobre a lista de discussão lista