[SQL] COUNT (Tellen meerdere velden NOT NULL) *

Pagina: 1
Acties:
  • 999 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Rixard
  • Registratie: September 2000
  • Laatst online: 22-10 14:02
Hoi, Ik heb een database met een aantal artikelen waar foto's bij horen.
Nu wil ik het graag het totale aantal foto's bij alle artikelen weten.

Ik heb 6 kolommen |Foto1|Foto2|Foto3|.......|Foto6|
Wanneer er een foto aanwezig is bij een artikel, dan staat er een "1" in en wanneer er geen foto bij hoort, dan is de waarde NULL (standaard waarde).

Dus bijvoorbeeld:
|Foto1|Foto2|Foto3|.......|Foto6|

|1 |1 | | | |


nu heb ik het volgende geprobeerd:

SELECT COUNT(*) FROM `112_Artikelen`
WHERE
Foto1 IS NOT NULL
AND Foto2 IS NOT NULL
AND Foto3 IS NOT NULL
AND Foto4 IS NOT NULL
AND Foto5 IS NOT NULL

ik krijg nu als resultaat 8 (dat is het totaal aantal rijen/artikelen), hoe zorg ik ervoor dat via SQL alle volle velden geteld worden?

Ik heb al erg veel gezocht omdat ik er liever zelf uit kwam, maar ik vindt nergens een goed antwoord :'(

Alvast bedankt voor de hulp! :)

PS. Mijn excuses voor het ontbreken van een goede titel, ik ben het vergeten. misschien zou het kunnen worden veranderd in: [SQL] COUNT (Tellen meerdere velden NOT NULL)

[ Voor 14% gewijzigd door Rixard op 01-07-2003 12:23 . Reden: ontbreken titel ]


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
2
3
4
5
6
7
SELECT COUNT(*) FROM `112_Artikelen`
WHERE
Foto1 IS NOT NULL
OR Foto2 IS NOT NULL
OR Foto3 IS NOT NULL
OR Foto4 IS NOT NULL
OR Foto5 IS NOT NULL

Dit misschien?
Alle rijen waarbij minimaal 1 van de kolommen gevuld is.

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

where NOT (fotot1 is null or foto2 is null or ...)

kwestie van binaire logica toepassen. Maarreuh, je databasemodel is opzich niet zo heel mooi.. Als je meerdere dezelfde kolommen in je tabel hebt, had je dat in de meeste gevallen eigenlijk met rijen moeten oplossen :)

edit:
justmental's oplossing is fout trouwens :P

[ Voor 10% gewijzigd door ACM op 01-07-2003 12:24 ]


Acties:
  • 0 Henk 'm!

  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 22-10 08:47
maar je blijft het aantal records terugkrijgen waar foto's in staan en niet het aantal foto's.

Dus zul je toch echt een aparte foto tabel moeten maken.

[ Voor 30% gewijzigd door Pino op 01-07-2003 12:26 ]

"If you don't know where you are going, any road will take you there"


Acties:
  • 0 Henk 'm!

  • Rixard
  • Registratie: September 2000
  • Laatst online: 22-10 14:02
Nee, dit is geen oplossing, want sommige artikelen hebben 2 foto's (dan staat dus alleen in kolom 1 en 2 een "1" (Foto1 en Foto2)) in andere misschien wel 6, dus OR moet het niet zijn.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:43
Ik ben het eens met ACM.
Je kan beter je datamodel anders maken. Als je het dan op die manier doet (die ACM zegt), dan ben je veel flexibeler. Je kan zoveel foto's bijhouden per artikel als je wilt, bewerkingen erop gaan makkelijker, en het tellen enzo ook. ;)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 10-10 14:20
code:
1
2
SELECT COUNT(*) FROM `112_Artikelen` 
    WHERE Foto1+Foto2+Foto3+Foto4+Foto5+Foto6=6

Geeft alle velden waarbij ze alle zes gevult zijn.
(zo kun je natuurlijk een beetje spelen met het aantal...;) )

Waarbij ik er natuurlijk even vanuit ga dat je Foto1 enz. velden van het type INT of TINYINT zijn (voor MySQL) of NUMBER indien je met MSSQL werkt. (* beetle71 is not sure about MSSQL)


edit:

[offtopic]
Mmmh 6 replies binnen 2 minuten..... :)
[/offtopic]

[ Voor 27% gewijzigd door beetle71 op 01-07-2003 12:28 ]


Acties:
  • 0 Henk 'm!

  • Rixard
  • Registratie: September 2000
  • Laatst online: 22-10 14:02
ACM -> Dit zijn niet de enige velden in deze tabel :-) er staan nog veel meer zoals artikel_tekst,artikel_titel etc. en dus die velden van de plaatjes, maar de rest gaat allemaal goed, behalve dit tellen.

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

ACM schreef op 01 July 2003 @ 12:24:
edit:
justmental's oplossing is fout trouwens :P
Ik lees net dat ie het totaal aantal foto's wil weten :o
Zal wel een edit wezen ;)
Jouw oplossing is ook gaar trouwens :P

in Oracle SQL zou je dit oplossen met 'select sum(nvl(foto1, 0)+nvl(foto2, 0)+...) ...'

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • Danfoss
  • Registratie: Mei 2000
  • Laatst online: 22:00

Danfoss

Deze ruimte is te koop..

Je wilt dus per Record het aantal volle kolommen tellen?

SELECT (Foto1 + Foto2 + Foto3 etc) as aantal from 112_Artikelen

Als je DB geen telling van NULLS ondersteund (het resultaat wordt dan ook NULL) dan moet je de NULLS afvangen door bijvoorbeeld ifnull(foto1,0) te gebruiken (als je DB die functie heeft)

Sys Specs


Acties:
  • 0 Henk 'm!

  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 22-10 08:47
volgens mij moet het wel lukken met een:
code:
1
select (sum(foto1)+sum(foto2)...


maar het is niet netjes


edit: justmental was er al :)

[ Voor 14% gewijzigd door Pino op 01-07-2003 12:29 ]

"If you don't know where you are going, any road will take you there"


Acties:
  • 0 Henk 'm!

  • brokenp
  • Registratie: December 2001
  • Laatst online: 22:54
nee, dit voldoet niet denk ik, als een rij 2 foto's heeft, dan telt ie deze maar als 1.
Ik denk dat je dit kan doen door eerst het aantal in kollom foto1, dan foto2 ..foto6 en deze getallen optellen.

Ik weet niet waarom je je database zo hebt ingericht, maar voor zover ik dit bekijk vind ik dit geen goed ontwerp, je hebt nu waarschijnlijk zo'n scructuur.
tabel artikelen:
ID | omschrijving | Foto1 | Foto2 ...| Foto6

terwijl ik dit voorstel
tabel artikelen:
ID | omschrijving

tabel foto's:
fotoID | padnaam/blobveld | artikelID

Dit heeft als voordeel dat je evt ook voorbij de 6 foto's kan gaan, en dat je tel querie een stuk eenvoudiger wordt. Nadeel is dat je om een artikel met bijbehorende foto's moet gaan joinen (iets ingewikkeldere queries)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22-10 14:14

Janoz

Moderator Devschuur®

!litemod

Om je probleem op te lossen kun je het beste je datamodel fatsoeneren. Foto's in een aparte tabel met een reverentie naar het bijbehorende artikel. In dat geval kun je ook meer dan 6 foto's bij een artikel doen. Als het je alleen om het aantal foto's gaat (zoals het er nu naar uitziet) dan kun je misschien veel beter een aantal foto's opslaan ipv 'het aantal kolomen waar een 1 in staat'.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Rixard
  • Registratie: September 2000
  • Laatst online: 22-10 14:02
Hmm.. het is een MySQL server, die moet dat wel kunnen toch? en de standaard waarde staat op NULL, dus als er niks ingevuld is, dan is het toch zowiezo NULL ?

Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Je kan dus beter een aparte tabel maken met fotos. Met bijvoorbeeld de velden:

FotoID, Artikel_ID, Fotonummer, FotoURL (?)

of zoiets. Dan kan in ieder geval een willekeurig aantal foto's gebruiken en makkelijk tellen etc.

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • Rixard
  • Registratie: September 2000
  • Laatst online: 22-10 14:02
Er hoeven maar maximaal 6 foto's bij elk artikel (ivm opslag). Ik ben het wel eens, dat ik het beter anders aan had kunnen pakken, maar de database is er nou eenmaal zo en het is te laat om het aan te passen :(

Acties:
  • 0 Henk 'm!

  • Danfoss
  • Registratie: Mei 2000
  • Laatst online: 22:00

Danfoss

Deze ruimte is te koop..

Als je echt maar 6 foto´s hebt, kan je gewoon de kolommen optellen. Dus foto1 + foto2 + foto3 etc.. Dit werkt trouwens ALLEEN als je 1´tjes gebruikt als indicatie of er een foto is.

Gebruik je een iets anders (een Y bijvoorbeeld) zul je dat met een CASE statement af moeten vangen.

Sys Specs


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 10-10 14:20
Danfoss schreef op 01 July 2003 @ 12:40:
Als je echt maar 6 foto´s hebt, kan je gewoon de kolommen optellen. Dus foto1 + foto2 + foto3 etc.. Dit werkt trouwens ALLEEN als je 1´tjes gebruikt als indicatie of er een foto is.

Gebruik je een iets anders (een Y bijvoorbeeld) zul je dat met een CASE statement af moeten vangen.
Zie mijn eerdere post ;)

Acties:
  • 0 Henk 'm!

Verwijderd

The COUNT functie telt nooit velden die NULL zijn. De WHERE condities zijn dus niet nodig.

Dit zou het moeten doen.

SELECT COUNT(foto1) +
COUNT(foto2) +
COUNT(foto3) +
COUNT(foto4)+
COUNT(foto5) +
COUNT(foto6)
FROM 112_Artikelen


Dit telt het totaal aantal velden die niet NULL zijn. Dit is dus gelijk aan het totaal aantal foto's.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 10-10 14:20
Verwijderd schreef op 01 July 2003 @ 13:27:
The COUNT functie telt nooit velden die NULL zijn. De WHERE condities zijn dus niet nodig.

Dit zou het moeten doen.

SELECT COUNT(foto1) +
COUNT(foto2) +
COUNT(foto3) +
COUNT(foto4)+
COUNT(foto5) +
COUNT(foto6)
FROM 112_Artikelen


Dit telt het totaal aantal velden die niet NULL zijn. Dit is dus gelijk aan het totaal aantal foto's.
Dit telt het totale aantal foto's in de database :?

Edit:
* beetle71 ontdekt dat dat dus de bedoeling was ?!?

Ik dacht dat er met:
Nu wil ik het graag het totale aantal foto's bij alle artikelen weten.
werd bedoeld het totale aantal foto's per artikel, dus 1,2,3,4,5 of 6

[ Voor 22% gewijzigd door beetle71 op 01-07-2003 15:08 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Rixard schreef op 01 July 2003 @ 12:20:
Hoi, Ik heb een database met een aantal artikelen waar foto's bij horen.
Nu wil ik het graag het totale aantal foto's bij alle artikelen weten.
#1 Het totaal aantal foto's van alle artikelen. of
#2 Het totaal aantal foto's per artikel

Waarschijnlijk het tweede.
Ik heb 6 kolommen |Foto1|Foto2|Foto3|.......|Foto6|
Wanneer er een foto aanwezig is bij een artikel, dan staat er een "1" in en wanneer er geen foto bij hoort, dan is de waarde NULL (standaard waarde).

Dus bijvoorbeeld:
|Foto1|Foto2|Foto3|.......|Foto6|

|1 |1 | | | |


nu heb ik het volgende geprobeerd:

SELECT COUNT(*) FROM `112_Artikelen`
WHERE
Foto1 IS NOT NULL
AND Foto2 IS NOT NULL
AND Foto3 IS NOT NULL
AND Foto4 IS NOT NULL
AND Foto5 IS NOT NULL

ik krijg nu als resultaat 8 (dat is het totaal aantal rijen/artikelen), hoe zorg ik ervoor dat via SQL alle volle velden geteld worden?
code:
1
2
3
SELECT ArtikelId, sum(foto1)+sum(foto2)+sum(foto3)+sum(foto4)+sum(foto5)+sum(foto6)
FROM 112_Artikelen
GROUP BY ArtikelId

Sum zou je ook kunnen vervangen door count() in dit geval, omdat de group by toch maar elke keer één rij oplevert en in de velden de waarden 1 staat.
Pagina: 1