Probleme mit count und union

Bootsy99

Benutzer
Beiträge
6
Hallo,

ich habe ein Problem mit einer Count/Union Abfrage. Die Abfrage liefert die richtigen Ergebnisse,
aber der AS Wert wird nur in der ersten Abfrage genutzt. Dies hilft mir nur leider nicht zum Erstellen eines Charts.

Dies ist meine Abfrage:

SELECT Distinct count(Title) as Vinyl FROM `AudioAlbum` WHERE Media = 'LP'
Union
Select Distinct count(Title) as CD FROM `AudioAlbum` WHERE Media = 'CD'
Union
SELECT Distinct count(Title) as Digital FROM `AudioAlbum` WHERE Media = 'MP3'

Ergebnis der Abfrage:

Vinyl
1234
567
172

So hätte ich es gerne, damit ich daraus mein Chart aufbauen kann:

Vinyl 1234
CD 567
Digital 172

Hat jemand eine Idee für mich. Bedanke mich schonmal.

Lars
 
Werbung:
Eine Union auf die gleiche Tabelle / Struktur ist nicht nötig / angemessen / unüblich.
Ansatz:
select media, count(*) FROM `AudioAlbum` WHERE Media in ('LP' .. usw. was Du magst )
group by media
 
Oh, das ging ja schnell. Befürchte aber, das wird nicht klappen. Habe die Abfrage etwas abgespeckt. Das ist die komplette Abfrage:

SELECT Distinct count(Title) as CD FROM `AudioAlbum` WHERE Media = 'LP' or Media = "12''" or Media = 'LP 2x' or Media = "7’’" or Media = 'LP 3x' or Media = "12'' 2x" or Media = "10''" or Media = "LP & 12''" or Media = "LP 2x & Bonus" or Media = "LP 4x" or Media = "10'' x3"
Union
Select Distinct count(Title) as CD FROM `AudioAlbum` WHERE Media = 'CD' or Media = 'CD 2x' or Media = 'CD Maxi' or Media = 'CD 3x' or Media = 'CD 5x' or Media = 'CD & DVD'
Union
SELECT Distinct count(Title) as Digital FROM `AudioAlbum` WHERE Media = 'MP3' or Media = "Other"
 
Oh, das ging ja schnell. Befürchte aber, das wird nicht klappen. Habe die Abfrage etwas abgespeckt. Das ist die komplette Abfrage:

SELECT Distinct count(Title) as CD FROM `AudioAlbum` WHERE Media = 'LP' or Media = "12''" or Media = 'LP 2x' or Media = "7’’" or Media = 'LP 3x' or Media = "12'' 2x" or Media = "10''" or Media = "LP & 12''" or Media = "LP 2x & Bonus" or Media = "LP 4x" or Media = "10'' x3"
Union
Select Distinct count(Title) as CD FROM `AudioAlbum` WHERE Media = 'CD' or Media = 'CD 2x' or Media = 'CD Maxi' or Media = 'CD 3x' or Media = 'CD 5x' or Media = 'CD & DVD'
Union
SELECT Distinct count(Title) as Digital FROM `AudioAlbum` WHERE Media = 'MP3' or Media = "Other"
der Ansatz von @dabadepdu ist schon okay, Du mußt das nur entsprechend aufbauen.
 
Ja genau. Es geht um eine Zusammenfassung. Alle zu "Vinyl", "CD" oder Digital". Und Daus diesen 3 Werten inkl den Kategorien will ich ein Chart erstellen.

Hänge mal einen Screenshot an. In der Legende siehst du meine Problem. Alle 3 Werte sind "Vinyl"
Screenshot at Mar 31 10-49-55.png
 
Habe alle Antworten gelesen. Stehe aber leider auf dem Schlauch.
Code:
postgres=# create table bootsy (medium text, anzahl int);
CREATE TABLE
postgres=# copy bootsy from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> cd    10
>> cd    12
>> vinyl    15
>> mp3    42
>> \.
COPY 4
postgres=# select medium, count(1) from bootsy group by medium;
 medium | count 
--------+-------
 vinyl  |     1
 cd     |     2
 mp3    |     1
(3 rows)

postgres=# select medium, sum(anzahl) from bootsy group by medium;
 medium | sum 
--------+-----
 vinyl  |  15
 cd     |  22
 mp3    |  42
(3 rows)

postgres=#
 
Habe ich verstanden. Danke. Aber ich will ja ganz viele Werte zusammenfassen.
Das ist alles unter Vinyl:
SELECT Distinct count(Title) as CD FROM `AudioAlbum` WHERE Media = 'LP' or Media = "12''" or Media = 'LP 2x' or Media = "7’’" or Media = 'LP 3x' or Media = "12'' 2x" or Media = "10''" or Media = "LP & 12''" or Media = "LP 2x & Bonus" or Media = "LP 4x" or Media = "10'' x3"
 
gut, okay, du willst also zusammenfassen. ich würde es so machen:

Code:
postgres=# select * from bootsy ;
 medium | anzahl 
--------+--------
 cd     |     10
 cd     |     12
 vinyl  |     15
 mp3    |     42
 cd1    |      4
 cd2    |     10
 vinyl1 |     12
 vinyl2 |     22
 mp3_1  |     10
 mp3_2  |     33
(10 rows)

postgres=# select count(anzahl) filter (where medium in ('cd','cd1','cd2')) as cd, count(anzahl) filter (where medium ~ 'vinyl') as vinyl, count(anzahl) filter (where medium ~ 'mp3') as mp3 from bootsy ;
 cd | vinyl | mp3 
----+-------+-----
  4 |     3 |   3
(1 row)

postgres=#

allerdings habe ich kein MySQL. Du müßtest das umschreiben auf count(case when ...) ..., überlasse ich Dir zur Übung.
 
Werbung:
Zurück
Oben