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  Baze de date, tabele, view-uri si indecsi  Select cu 4 gra...
 Select cu 4 grade de total
 
 2/1/2012 4:10:09 PM
User is offlineioandan_chelemen2006
224 posts
4th


Select cu 4 grade de total
 (N/A) Modified By ioandan_chelemen2006  on 2/1/2012 5:10:26 PM)
Am o tabela de personal cu urmatoarele cimpuri :
-CNP;
-Nume;
-Prenume;
-Functie;
-Cod  (valori: 0,1,2,3);
-Data_angaj;
-Data_plec;
Imi trebuie o contorizare grupata dupa: functie, cod, sex si grupe de virsta (21-25, 26-30, 31-35, 36-40, 41-45, 46-50, 51-55, 56-60, 61-65, peste 65);
cu conditia empty(data_plec) or data_angaj > data_plec;
Am posibilitatea sa folosesc functie de retunare sex avind ca parametru CNP si functie de returnare virsta avind ca parametru tot CNP;
Mi-ar trebui un SELECT care sa-mi rezolve problema. Am incercat sa construiesc ceva dar nu prea mi-a iesit. Astept idei. Multumesc.


 2/1/2012 7:00:43 PM
User is offlineioandan_chelemen2006
224 posts
4th


Re: Select cu 4 grade de total
 (N/A)
vaz ca numai zice nimeni nimic, dupa multa sudoare am ajuns la urmatoarea varianta, vreau sa stiu daca e cistigatoare:
PROCEDURE select_4_grade_total
******************************
CLOSE ALL
USE d:\personal.2.0.\baze\personal EXCLUSIVE
SELECT distinct func, cod_m, SUBSTR(STR(cnp,13),1,1) AS sex,;
IIF(GetAgeFromCNP(cnp)<25,1,IIF(GetAgeFromCNP(cnp)>=25 AND GetAgeFromCNP(cnp)<35,2,;
IIF(GetAgeFromCNP(cnp)>=35 AND GetAgeFromCNP(cnp)<45,3,;
IIF(GetAgeFromCNP(cnp)>=45 AND GetAgeFromCNP(cnp)<55,4,;
IIF(GetAgeFromCNP(cnp)>=55 and GetAgeFromCNP(cnp)<65,5,;
IIF(GetAgeFromCNP(cnp)>=65,6,0)))))),;
COUNT(*);
 FROM personal;
  GROUP BY func,cod_m,cnp;
   WHERE EMPTY(dataa0) OR dataa0>datai13 AND func="MED"
RETURN   
  
FUNCTION GetAgeFromCNP
PARAMETERS nCnp, dDate as Date
    LOCAL nAge as Integer
    IF PCOUNT()==1
        dDate=DATE()
    ENDIF
    nAge=YEAR(dDate)-(IIF(INLIST(VAL(SUBSTR(STR(nCnp,13,0),1,1)),1,2),1900,2000)+VAL(SUBSTR(STR(nCnp,13,0),2,2)))
    IF VAL(SUBSTR(STR(nCnp,13,0),4,2))>MONTH(dDate)
        nAge=nAge-1           
    ENDIF
    IF VAL(SUBSTR(STR(nCnp,13,0),4,2))=MONTH(dDate)   
        IF VAL(SUBSTR(STR(nCnp,13,0),6,2))>DAY(dDate)
            nAge=nAge-1
        ENDIF
    ENDIF
RETURN nAge
 2/1/2012 9:57:13 PM
User is offlinemmarius28
139 posts
5th


Re: Select cu 4 grade de total
 (N/A)
Nu am date sa verific, dar cred ca select-ul tau este corect, mai putin gruparea dupa CNP. Nu faci grupe dupa CNP, ci dupa sex, si grupa de varsta.

M-am gandit
sa extrag grupa de varsta in functia CNP2Grupa ca sa curat select-ul.


CLOSE ALL
USE d:\personal.2.0.\baze\personal EXCLUSIVE
SELECT func, cod_m, SUBSTR(STR(cnp,13),1,1) AS sex,
CNP2Grupa(cnp) as grupa, COUNT(*) as nr;
 FROM personal;
  GROUP BY 1,2,3,4;
   WHERE (EMPTY(dataa0) OR dataa0>datai13) AND func="MED" ;
into cursor crsGrup

RETURN   
  


FUNCTION CNP2Grupa
PARAMETERS nCnp, dDate as Date
    LOCAL nAge as Integer, lnGrupa as Integer
    IF PCOUNT()==1
        dDate=DATE()
    ENDIF
    lnGrupa = 1
    nAge=YEAR(dDate)-(IIF(INLIST(VAL(SUBSTR(STR(nCnp,13,0),1,1)),1,2),1900,2000)+VAL(SUBSTR(STR(nCnp,13,0),2,2)))
    IF VAL(SUBSTR(STR(nCnp,13,0),4,2))>MONTH(dDate)
        nAge=nAge-1           
    ENDIF
    IF VAL(SUBSTR(STR(nCnp,13,0),4,2))=MONTH(dDate)   
        IF VAL(SUBSTR(STR(nCnp,13,0),6,2))>DAY(dDate)
            nAge=nAge-1
        ENDIF
    ENDIF

do case
case nAge < 25
  lnGrupa = 1
case nAge < 35
  lnGrupa = 2
case nAge < 45
  lnGrupa = 3
case nAge < 55
  lnGrupa = 4
case nAge < 65
  lnGrupa = 5
otherwise
  lnGrupa = 6
endcase

return lnGrupa

In plus, daca doresti sa pui grupele de varsta pe coloane (pivotare), poti sa faci ulterior:

SELECT func, cod_m, sex, ;
sum(iif(
grupa = 1, nr, 0)) as grupa_21_25, ;
sum(iif(grupa = 2, nr, 0)) as grupa_26_35, ;
sum(iif(grupa = 3, nr, 0)) as grupa_36_45, ;
sum(iif(grupa = 4, nr, 0)) as grupa_46_55, ;
sum(iif(grupa = 5, nr, 0)) as grupa_56_65, ;
sum(iif(grupa = 6, nr, 0)) as grupa_66_99 ;
from crsGrupa ;
group by 1, 2, 3
into cursor crsPivot



 2/2/2012 12:08:57 PM
User is offlineioandan_chelemen2006
224 posts
4th


Re: Select cu 4 grade de total
 (Switzerland)
am inteles-o desi recunosc ca n-as fi in stare s-o scriu; acum trebuie sa renunt la cod_m, adica sa am contorizare dupa func, sex si grupe de virsta, nu sunt in stare s-o fac
 2/2/2012 5:04:57 PM
User is offlinemyself
64 posts


Re: Select cu 4 grade de total
 (N/A)
 ioandan_chelemen2006 wrote
am inteles-o desi recunosc ca n-as fi in stare s-o scriu; acum trebuie sa renunt la cod_m, adica sa am contorizare dupa func, sex si grupe de virsta, nu sunt in stare s-o fac


SELECT COUNT(*) as numaraparitii, func, IIF(VAL(SUBSTR(ALLTRIM(cnp),1,1)) IN (1;5),'M','F') as sex,;
ICASE(BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),21,25), '21-25', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),26,30), '26-30', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),31,35), '31-35', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),36,40), '36-40', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),41,45), '41-45', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),46,50), '46-50', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),51,55), '51-55', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),56,60), '56-60', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),61,65), '61-65', ;
BETWEEN(VAL(SUBSTR(ALLTRIM(cnp),2,2)),65,9999), '65,9999') as grupa;
from crsGrupa ;
group by 1, 2, 3;
into cursor rezultat
Select rezultat
Browse


Ar trebuii sa mearga asta....
  Visual FoxPro  Baze de date, tabele, view-uri si indecsi  Select cu 4 gra...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement