Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Client/Server  Union cu trei s...
 Union cu trei selecturi
 
 3/6/2006 10:44:21 AM
User is offlineAlin Berce
371 posts
3rd




Union cu trei selecturi
 (Romania)
Am de rezolvat o chestie simpla dar la care nu-i dau de capat. Am trei tabele, facturi,avize,documente. In fiecare tabela printre altele memorez data la care a fost adaugat un document si userul/statia care l-a facut.
Doresc sa aflu cate documente a factut fiecare user/statia intr-un interval de timp.
Pentru acest lucru am facut trei selecturi de tipul:
select user_statia,data, count(*) as numar_documente from tabela where data>='20060101' and data<20060201
group by data, user_statia
order by data, user_statia

Am obtinut 3 selecturi care merg bine. Problema este cum fac cu union sa obtin rezultatul final: data, numar total de documente create, user statia.

Va multumesc.

VFP, C#, SQL Server 2005/2008
"Proud to be a ProFox member".
 3/6/2006 10:56:18 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Union cu trei selecturi
 (N/A) Modified By Daniel Buduru  on 3/6/2006 11:57:05 AM)

Mai intai union, apoi count pe rezultset.

Daca e VFP9, poti face asta:

select user_statia,data, count(*) as numar_documente from  ;
(select user_statia, data from tabela1 where data>='20060101' and data<20060201 ;
union select user_statia, data from tabela2 where data>='20060101' and data<20060201 ;
select user_statia, data from tabela3 where data>='20060101' and data<20060201) toate_documentele ;
group by data, user_statia


Daniel Buduru
 3/6/2006 11:11:41 AM
User is offlinenae racaru
714 posts
www.rarom.ro
1st




Re: Union cu trei selecturi
 (Romania)
 danbd wrote

Mai intai union, apoi count pe rezultset.

Daca e VFP9, poti face asta:

select user_statia,data, count(*) as numar_documente from  ;
(select user_statia, data from tabela1 where data>='20060101' and data<20060201 ;
union select user_statia, data from tabela2 where data>='20060101' and data<20060201 ;
select user_statia, data from tabela3 where data>='20060101' and data<20060201) toate_documentele ;
group by data, user_statia



Cred ca ar trebui sa arate astfel, altfel union-ul ascunde duplicatele.

select user_statia,data, count(*) as numar_documente from  ;
(select user_statia, data from tabela1 where data>='20060101' and data<20060201 ;
union ALL select user_statia, data from tabela2 where data>='20060101' and data<20060201 ;
UNION ALL select user_statia, data from tabela3 where data>='20060101' and data<20060201) toate_documentele ;
group by data, user_statia

VFP 6 si 9 + Oracle
 3/6/2006 11:36:09 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Union cu trei selecturi
 (N/A)

Corect. UNION elimina inregistrarile duplicate.

 


 


Daniel Buduru
 3/6/2006 12:56:10 PM
User is offlineAlin Berce
371 posts
3rd




Re: Union cu trei selecturi
 (Romania) Modified By Alin Berce  on 3/6/2006 2:24:34 PM)
Am uitat sa specific ca eu fac chestia asta in sql server 7 intr-o procedura stocata. Am incercat ce imi ziceti voi insa nu cred ca stie sql sa faca asa, zice ca:
No column was specified for column 1 of 'orice scriu eu aici'.
'. inainte de group by de la final. Insa inclin sa cred ca e vorba de modul in care convertesc eu data.

Aici e si selectu buclucas, ca poate am omis eu ceva:
select convert(varchar(11),data_oper,106), user_statia,count(*) as numar_documente from
(select convert(varchar(11),data_oper,106), user_statia
from facturi
where facturi.data>='20060101' and facturi.data<='20060202'
union all
select convert(varchar(11),data_oper,106) , user_statia
from avize
where avize.data>='20060101' and avize.data<='20060202'
union all
select convert(varchar(11),data_oper,106) , user_statia
from documente
where documente.data>='20060101' and documente.data<='20060202') toate_documentele
group by convert(varchar(11),data_oper,106) , user_statia

VFP, C#, SQL Server 2005/2008
"Proud to be a ProFox member".
 3/6/2006 1:36:57 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Union cu trei selecturi
 (N/A)

 alinescoo wrote
Am uitat sa specific ca eu fac chestia asta in sql server 7 intr-o procedura stocata. Am incercat ce imi ziceti voi insa nu cred ca stie sql sa faca asa, zice ca: ........

Te-ai gandit ca solutia este aceasi de la FPD26 la VFP9, MSSQL2005, Oracle, MySQL, Firebird , etc, ca doar e vorba de SQL ...
N-am lucrat de mult cu SQL 7, dar sunt sigur ca nu merge adliteram sintaxa din VFP9.
Creeaza un cursor temporar pe server cu rezultatul union-ului, apoi aplica pe el selectul cu count si group.


Daniel Buduru
 3/6/2006 1:58:14 PM
User is offlinenae racaru
714 posts
www.rarom.ro
1st




Re: Union cu trei selecturi
 (Romania) Modified By nae racaru  on 3/6/2006 3:02:49 PM)
 alinescoo wrote
Am uitat sa specific ca eu fac chestia asta in sql server 7 intr-o procedura stocata. Am incercat ce imi ziceti voi insa nu cred ca stie sql sa faca asa, zice ca:
No column was specified for column 1 of 'orice scriu eu aici'.
'. inainte de group by de la final. Insa inclin sa cred ca e vorba de modul in care convertesc eu data.

Aici e si selectu buclucas, ca poate am omis eu ceva:
select convert(varchar(11),data_oper,106), user_statia,count(*) as numar_documente from
(select convert(varchar(11),data_oper,106), user_statia
from facturi
where facturi.data>='20060101' and facturi.data<='20060202'
union all
select convert(varchar(11),data_oper,106) , user_statia
from avize
where avize.data>='20060101' and avize.data<='20060202'
union all
select convert(varchar(11),data_oper,106) , user_statia
from documente
where documente.data>='20060101' and documente.data<='20060202') toate_documentele
group by convert(varchar(11),data_oper,106) , user_statia


Nu cred ca union all merge in sql server, asa ca mi-am retras postul.


VFP 6 si 9 + Oracle
 3/9/2006 11:53:00 AM
User is offlineAlin Berce
371 posts
3rd




Re: Union cu trei selecturi
 (Romania)
Ok, dupa mai multe incercari am reusit sa obtin ceva care 'pare' ca functioneaza corect:

CREATE PROCEDURE articole_culese
@firma varchar(5), -- trei parametrii pentru procedura @firma - reprezinta codul firmei,
@di varchar(20), -- @di - data de inceput
@df varchar(20) -- @df - data finala
AS
select a.data,sum(a.culese) as culese,a.utilizator from ((
select convert(varchar(11),data_oper,106) as data,count(*) as culese, utilizator
from facturi
where (facturi.cod_unit=@firma) and (facturi.data_oper>=@di) and (facturi.data_oper<@df)
group by convert(varchar(11),data_oper,106),utilizator
)
union
(select convert(varchar(11),data_oper,106) as data ,count(*) as culese, utilizator
from avize
where (avize.cod_unit=@firma) and (avize.data_oper>=@di) and (avize.data_oper<@df)
group by convert(varchar(11),data_oper,106),utilizator
)
union
(select convert(varchar(11),data_oper,106) as data , count(*) as culese, utilizator
from documente
where (documente.cod_unit=@firma) and (documente.data_oper>=@di) and (documente.data_oper<@df)
group by convert(varchar(11),data_oper,106),utilizator
)) a
group by data, utilizator
order by data,utilizator

Problema e ca nu mi se returneaza inregistrarile cum vreau eu, adica returneaza ceva de genul:

01 ian 2006 ...
01 feb 2006 ...
02 ian 2006 ...
02 feb 2006 ...
...........
Eu as vrea sa imi arate prima data toata luna ianuarie, aopi toata luna februarie. Nu intercalate.
Ma poate ajuta cineva? Multumiri.


VFP, C#, SQL Server 2005/2008
"Proud to be a ProFox member".
 3/9/2006 11:57:35 AM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Union cu trei selecturi
 (N/A)
Problema deriva din faptul ca "data" nu mai e data, ci caracter. Ca sa se ordoneze dupa data ar trebui sa faci un CAST() inapoi la date si sa ordonezi dupa ea. Alternativ, ai putea adauga si campul data in SELECT, fara sa faci socoteli cu el, si sa pui campul ala in ORDER BY.
Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 3/9/2006 12:13:19 PM
User is offlineAlin Berce
371 posts
3rd




Re: Union cu trei selecturi
 (Romania)
"Alternativ, ai putea adauga si campul data in SELECT, fara sa faci socoteli cu el, si sa pui campul ala in ORDER BY"
Nu cred ca inteleg exact ce ai vrut sa spui. Eu a trebuit sa recurg la transformarea campului data deoarece era de forma
'24/02/2006 10:54:27' si in acest caz nu putea face gruparea pe zile.
O sa incerc cu cast. Multumesc pentru raspunsul rapid.

VFP, C#, SQL Server 2005/2008
"Proud to be a ProFox member".
 3/9/2006 12:28:04 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Union cu trei selecturi
 (N/A) Modified By Grigore Dolghin  on 3/9/2006 1:30:22 PM)

Un fragment de cod:

[...] union
(select convert(varchar(11),data_oper,106) as data, data_oper as DataFolositaInOrdonare , count(*) as culese, utilizator
from documente[...]
Order By DataFolositaInOrdonare [...]

Adica mai adaugi o data campul datetime, si il lasi neatins. In OrderBy-ul final il folosesti pe ala.

Edit: Faptul ca acelasi camp trebuie si prelucrat cu Convert() pentru ca iti trebuie si in alte situatii nu te impiedica _sa_mai_adaugi_ o data campul, si sa-l folosesti pentru ordonare.


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 3/9/2006 12:58:39 PM
User is offlineAlin Berce
371 posts
3rd




Re: Union cu trei selecturi
 (Romania)
Bingo! Nu m-am gandit. Silly me. Inca o data acest forum m-a luminat! Multumiri!
VFP, C#, SQL Server 2005/2008
"Proud to be a ProFox member".
 3/9/2006 1:16:37 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Union cu trei selecturi
 (N/A)
You're welcome, Alin.
Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
  Visual FoxPro  Client/Server  Union cu trei s...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement