Contare e raggruppare numero di colonne valorizzate variabili

sabato 08 agosto 2015 - 12.43
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Visual Studio Express  |  MySQL 5.1  |  Access (.mdb)  |  Firefox  |  CSS 2.1

ravalon Profilo | Expert

Salve a tutti,

sto lavorando ad una estrazione su file DBF ed ho una tabella che contiene le sigle degli esami condotti, una colonna per ogni esame utilizzato.

Le colonne per gli esami sono 9 ma non sempre ho la necessità di condurre tutti e 9 gli esami, per cui le colonne esami valorizzate per ogni record variano e talvolta presentano valori NULL.

Qualcosa di questo tipo (Cerco di riprodurre schematicamente struttura e risultati possibili):

---------------------------------------------------------------------------
DataEsame|Esa1|Esa2|Esa3|Esa4|Esa5|Esa6|Esa7|Esa8|Esa9
---------------------------------------------------------------------------
2015-08-06|CTA|CNE|TRE|DER|FRT|FGT|HYU|KIO|LLO
2015-08-07|CTA|CNE|TRE| null| null| null| null|null|null
2015-08-08|ECW|PSD|TRE|22W|37W| null| null|null|null

Quello che vorrei ottenere è un raggruppamento che mi conti riga per riga tutti gli esami uguali, ovvero simile a questo:

CTA|2
CNE|2
TRE|3
DER|1
...e via dicendo

La mia difficoltà è nel sapere come fare il count quando il campo è valorizzato e come lasciar perdere quando è nullo.

Spero p

renarig Profilo | Expert

>La mia difficoltà è nel sapere come fare il count quando il campo
>è valorizzato e come lasciar perdere quando è nullo.

Non ho capito bene, ma provo ad abbozzare una idea ......

Premesso che il Count(.......) nativamente NON conta i Null
Forse hai delle stringhe a lunghezza zero

Potresti trasformare il Count(.....) in Sum(.....)

Sum ( If Campo = Null Then 0 Else 1 )
Da adattare la sintassi al tuo DB

Facci sapere



ravalon Profilo | Expert

ciao, ho provato un adattamento di questo tipo:

SELECT Campo1, Sum(iif(isnull(Campo1),0,1)) as conta1,Campo2, Sum(iif(isnull(Campo2),0,1)) as conta2
FROM `TABELLA`
group by Campo1,Campo2

Ma ottengo questo:

CON;28;NULL;0
CON;715;CEC;715
COT;48;KLT;48
COT;1006;STT;1006
CTA;417;ECW;417
CTD;428;CFD;428
CTL;18;PAL;18
ECP;9;ENP;9
LAL;21;NULL;0
LEG;5;NULL;0
PHW;1;CNW;1
PSD;1;CTD;1
PST;26;NULL;0
SAS;91;MAR;91
SFA;1;ECW;1
SFA;1;PSL;1

Intanto noto che il CAMPO "CON" ad esempio è riportato su due righe...e cosi altri...quindi non li somma...

Inoltre vedo che sulle stesse righe sono riportati gli stessi conteggi, quindi qualcosa non va...

P.S. ho dovuto usare IIF anzichè il classico costrutto IF THEN ELSE perchè su dbase mi va in errore...

renarig Profilo | Expert

Veramente non ho capito se tu vuoi contare gli esami uguali
per Riga (record) o Colonna (campo) oppure per entrambi

nel 1° post ci passi un risultato parziale,
mentre nel terzo ci posti un risultato che dici errato .....

quindi, tornando al RecordSet di origine del 1° post
<citazione>
2015-08-06|CTA|CNE|TRE|DER|FRT|FGT|HYU|KIO|LLO
2015-08-07|CTA|CNE|TRE| null| null| null| null|null|null
2015-08-08|ECW|PSD|TRE|22W|37W| null| null|null|null
</citazione>

dicci esattamente e fino in fondo il risultato desiderato
ordinato nei suoi campi


.

ravalon Profilo | Expert

[QUOTE]
Quello che vorrei ottenere è un raggruppamento che mi conti riga per riga tutti gli esami uguali, ovvero simile a questo:

CTA|2
CNE|2
TRE|3
DER|1
...e via dicendo

[/QUOTE]

cioè...indipendentemente dalla posizione della colonna, vorrei ottenere un conteggio totale degli esami con la stessa sigla...

Nel test che mi da un risultato sbagliato, ho provato a contare sia la prima colonna che la seconda...in totale ne devo contare ben NOVE...sicuramente c'è un modo per fare il conteggio ma per me il problema è che si trovano su colonne diverse

renarig Profilo | Expert

> .....che mi conti riga per riga tutti gli esami uguali .....

Mmmhh!! sara il caldo che mi mette fuori uso i neuroni ......
ma io nella prima riga ( record orizzontale ) di CTA ne conto 1
stesso discorso per CNE, TRE e DER

Per arrivare ai rusultati che ti aspetti a me sembra che il conteggio si
debba fare per colonna ( campo verticale )

ma poi non saprei che risultato ti aspetti da ECW ( 3° record primo campo dopo la data )
e per questo che ti avevo chiesto di darci il rusultato completo atteso ......

.

renarig Profilo | Expert

>...... un raggruppamento che mi conti riga per riga .......
>.... indipendentemente dalla posizione della colonna, .....

Forse con il fresco della sera ho capito, se tu vuoi il conteggio
riga per riga indipendentemente dalla posizione della colonna
significa che vuoi più semplicemente il GRAN conteggio totale
dei singoli esami nella tabella ( chiaramente raggruppati )


se fosse cosi io farei innanzitutto
- una UNION fra i tuoi 9 campi per mettere su campo unico i tuoi Esami
- escludiamo i Null
- infine un raggruppamento con conteggio

esemplificato su una tabella ( T1 ) di 3 campi ( c1, c2, c3 )
verrebbe cosi ( da adattare al tuo dbf )
SELECT W.Esame, Sum(1) AS ContEsame FROM ( SELECT T1.c1 AS Esame FROM T1 UNION ALL SELECT T1.c2 AS Esame FROM T1 UNION ALL SELECT T1.c3 AS Esame FROM T1 ) AS W GROUP BY W.Esame HAVING (W.[Esame] Is Not Null) ;

Facci sapere


PS:
Forse conviene eliminare i Null già nella UNION in
modo che nel ragruppamento siano gia esclusi,
ma non saprei neanche io cosa sia meglio perché
dovresti mettere 3 volte la WHERE
SELECT U.Esame, Sum(1) AS ContEsame FROM ( SELECT T1.c1 AS Esame FROM T1 WHERE (T1.c1 Is Not Null) UNION ALL SELECT T1.c2 AS Esame FROM T1 WHERE (T1.c2 Is Not Null) UNION ALL SELECT T1.c3 AS Esame FROM T1 WHERE (T1.c3 Is Not Null) ) AS U GROUP BY U.Esame ;

.

ravalon Profilo | Expert

Sei un grandissimo !!!!

E' esattamente quello che volevo, stavo anche io provando a fare una union ma non ci ero ancora riuscito...

Perfetto...credo che ho ottenuto il risultato necessario grazie a te!

Lascio ancora aperto il thread per un po nel caso avessi bisogno di qualche altro suggerimento di aggiustamento ma penso proprio che accetterò la tua ultima indicazione come esatta...


Intanto grazie mille !!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5