# Mehrere Count-Abfragen mit einem Query



## casa74 (1. März 2007)

Hallo Zusammen,

bin neu hier und möchte mich mit meinem ersten Problem erstmal vorstellen 
Versuche mich gerade an ASP und dem damit zum Teil verbundenen Datenbankthema,
und das führt mich auch schon zu meinem erstem Problem.

Ich versuche die Häufigkeit einer ID in Abhängigkeit von 2 Spalteneinträgen 
zu ermitteln.
Ich weiss wie ich das in zwei separaten Queries hinkriege,
aber ich hätte es gerne in einem Query zusammengefasst.

select count(ID) As Anzahl_A from "Tabelle" where "Spalte" = 'A' 
select count(ID) As Anzahl_B from "Tabelle" where "Spalte" = 'B' 


Der Hintergrund ist der, daß ich über ASP die Werte ermitteln
und anzeigen möchte und dabei nur einen Query ausführen möchte.

Für eine Lösung oder Alternative meines Problems wäre ich euch sehr dankbar.


MFG 

Casa


----------



## Nico Graichen (1. März 2007)

Hi,

UNION ist das Schlüsselwort, was du suchst 
ungefähr so:

```
select count(ID) As Anzahl_A from "Tabelle" where "Spalte" = 'A'
UNION
select count(ID) As Anzahl_B from "Tabelle" where "Spalte" = 'B'
```

Aber mal eine Frage offtopic:
Wieso jetzt noch neu in ASP einsteigen und nicht in ASP.NET?


----------



## casa74 (1. März 2007)

Hi niggo,

erstmal vielen Dank für deine rasche Antwort, hast mich schon ein Stück weitergebracht.
Habe deinen Query mal im SQL Query Analyzer getestet und tatsächlich bekomme ich beide Count-Werte.
Was mich allerdings noch verwirrt,ist daß beide Ergebnisse unter einer Spalte in 2 Reihen angezeigt werden.

Sieht dann so aus :

        | Anzahl_A
-----------------------
1      |   100
2      |   200


Hätte dort jetzt so etwas erwartet :

        | Anzahl_A    |   Anzahl_B
--------------------------------------------------
1      |   100           |   200



Wenn ich dann versuche mit Recordset:

_Anzahl_B  = objRS("Anzahl_B")
Anzahl_A  = objRS("Anzahl_A")_

das ganze in 2 Variablen zu speichern, laufe ich auf folgenden Fehler :
_Item cannot be found in the collection corresponding to the requested name or ordinal._




Antwort Offtopic:
Weiss ich selbst nicht so genau, dachte für den Einstieg ist ASP besser.


----------



## ar43r (4. März 2007)

so muss das gehen:

```
SELECT count(*) AS Anzahl
,(SELECT count(*) FROM Customers WHERE CompanyName like 'A%') AS Anzahl_A
,(SELECT count(*) FROM Customers WHERE CompanyName like 'B%') AS Anzahl_B
FROM Customers
```

Diese Abfrage habe ich gegen Northwind DB getestet


----------



## tobias_petry (4. März 2007)

performanter sollte folgendes sein, falls du alle versch. Werte der Tabelle brauchst:

```
SELECT COUNT(*) AS `anzahl` FROM `tabelle` GROUP BY `spalte`
```

Nebenbei möchte ich noch anmerken, dass ein Count auf eine Spalte langsamer ist als auf alle Datensätze einer Tabelle, da er dann nicht auf null-Werte überprüft


----------



## ar43r (4. März 2007)

tobias_petry hat gesagt.:


> performanter sollte folgendes sein, falls du alle versch. Werte der Tabelle brauchst:
> 
> ```
> SELECT COUNT(*) AS `anzahl` FROM `tabelle` GROUP BY `spalte`
> ```



Wie soll es das ausgeben was casa74 moechte?


tobias_petry hat gesagt.:


> Nebenbei möchte ich noch anmerken, dass ein Count auf eine Spalte langsamer ist als auf alle Datensätze einer Tabelle, da er dann nicht auf null-Werte überprüft



Dafuer ist es aber sicherer.


----------



## tobias_petry (4. März 2007)

ar43r hat gesagt.:


> Wie soll es das ausgeben was casa74 moechte?


es tut doch das gleiche, nur das er eben die Count-Werte zeilenweise auslesen muss, dafür aber ist es aber um ein vielfaches schneller, da er nicht 2 getrennte Abfragen machen und diese mergen, sondern nur eine Abfrage macht.



ar43r hat gesagt.:


> Dafuer ist es aber sicherer.


sicherer? definiere sicherer?
Es ist genau das gleiche wie nen Count auf eine Spalte, nur dass es um ein vielfaches schneller ist, da ihm egal ist, was in der Spalte steht.

MySQL-Optimierung nennt man solche Dinge


----------



## ar43r (4. März 2007)

Er will das bekommen:

```
| Anzahl_A | Anzahl_B
--------------------------------------------------
1 | 100 | 200
```

Ich verstehe nicht was du mit 
SELECT COUNT(*) AS `anzahl` FROM `tabelle` GROUP BY `spalte` 
meinst....


----------



## tobias_petry (4. März 2007)

ar43r hat gesagt.:


> Er will das bekommen:
> 
> ```
> | Anzahl_A | Anzahl_B
> ...



das von ihm genannte ist ja ien Beispiel, also kann es ja sein, dass er 10-12 counts macht, das wären dann 11-13 Querys für die Datenbank (Count-Querys + mergen) das würde ziemlich auf die db-last gehen.
Mein Query zählt die Vorkommen JEDES wertes der spalte und gibt dies dann in mehreren Datensätzen aus, das ist für die Datenbank weit schonender. (auch bei nur 2 verschiedenen werten)


----------



## Nico Graichen (5. März 2007)

Hi,

Das ist klar, dass der Query mit Group By performanter ist. Aber schon beim Vorschlag mit UNION war das Ergebnis nicht das gewollte. Auch stehen die Datensätze in einer Spalte und nicht in einer Zeile.


----------



## wepino (14. Mai 2012)

So sollte es auch mit dem SQL-Server gehen:


```
select
(select count(ID) As Anzahl_A from "Tabelle" where "Spalte" = 'A' ) as A,
(select count(ID) As Anzahl_B from "Tabelle" where "Spalte" = 'B' ) as B
```

Sollte man nicht erstmal dem Frager eine Lösung aufzeigen, die einfach nur die Frage beantwortet?


----------



## Yaslaw (14. Mai 2012)

Nunja, der Frager hat die Frage im Jahre 2007 gestellt und hat insgesamt 7 Beiträge im Forum. Wir warten am besten mal bis er dir einen Vorschlag präsentiert.


----------



## Thomas Darimont (14. Mai 2012)

Hallo,

hier mal noch eine Alternative zu der UNION- bzw. Skalare-Subquery-Lösung :


```
SELECT [id]
      ,[attribut1]
      ,[attribut2]
  FROM [count_example]
```

Ausgabe:

```
id          attribut1                                          attribut2
----------- -------------------------------------------------- -----------
1           A                                                  11
2           B                                                  22
3           B                                                  33
4           A                                                  11
5           A                                                  33
6           C                                                  22

(6 Zeile(n) betroffen)
```

Zählen:

```
select 
   SUM(case when attribut1 = 'A' then 1 else 0 end) as "As"
  ,SUM(case when attribut1 = 'B' then 1 else 0 end) as "Bs"
  ,SUM(case when attribut1 = 'C' then 1 else 0 end) as "Cs"
  ,SUM(case when attribut2 = 11 then 1 else 0 end) as "11er"
  ,SUM(case when attribut2 = 22 then 1 else 0 end) as "22er"
  ,SUM(case when attribut2 = 33 then 1 else 0 end) as "33er"
  from count_example
```
 
 Ausgabe:

```
As          Bs          Cs          11er        22er        33er
----------- ----------- ----------- ----------- ----------- -----------
3           2           1           2           2           2

(1 Zeile(n) betroffen)
```
Gruß Tom


----------

