Problem Etikettendruck - Menge der Ausgabezeilen

Hallo,

ich habe ein Problem mit dem Erstellen einer Selektion.

Ich habe eine Tabelle mit Adressdaten und Spalten zu drei Zeitschriften (z1,z2,z3), die an die jeweiligen Empfänger gesendet werden sollen. Hinten dran ist eine Spalte mit einer laufenden Nummer. Diese laufende Nummer dient lediglich der Erkennung von doppelten Adressdaten, die durch ein Versenden von zwei unterschiedlichen Zeitschriften an eine Adresse verursacht werden. Somit kann ich jeweils mehrere (in diesem Fall bis zu drei) Etiketten für ein und dieselbe Adresse drucken.
Den Spalten, in denen Informationen über das Versenden der Zeitschriften stehen, habe ich entweder die Zahl 1 zugeordnet (–> soll gesendet werden), oder den Wert null (–>soll nicht gesendet werden).

Das heißt meine Tabelle, aus der ich die Daten selektiere, sieht zurzeit ungefähr so aus:

P_Nr     |    Name    |    Str    |    Hausnr    |    PLZ    |    Z1    |    Z2    |    Z3    |    Lfd_nr
1        |Hr Käse     |Gaudaweg   |5             |55122      |1         |null      |1         |  1 von 2
1        |Hr Käse     |Gaudaweg   |5             |55122      |1         |null      |1         |  2 von 2
2        |Hr Trink    |Durstigstr |18            |55119      |null      |1         |null      |  1 von 2

Blöderweise kann ich nun aber über die gesamten Datensätze keine Abfrage machen, die mir alle Datensätze zurückgibt für Zeitschrift 1 und 2. Also Etiketten nur für alle Z1=1 und Z2=2. Mir ist es nur möglich, entweder alle abzufragen, oder durch Modifizierung (ich habe einfach die Vermehrung der Zeilen einer gleichen P_Nr rückgängig gemacht) eine einzelne Zeitschrift.

Wie bekomme ich eine Abfrage hin, durch die ich nun nur alle Zeilen in der benötigten Menge zurückbekomme, aber nur für Zeitschrift 1 und 2 (bspw.) und nicht ebenfalls die Menge von Zeitschrift 3 hinzuaddiert wird ?

Mein SQL sieht zurzeit so aus. Da ich vorher noch einige Teile ranjoine (bspw. die Zeitschriftenversandinformationen ( 1 oder null) ), lasse ich mal einige temp tables weg, denn die Endabfrage hat eigentlich genügend Informationen:

select 
agt_nr
,name
,zust
,str
,plz
,ort
,erfasst
,Z_1
,Z_2
,Z_3
,(h.Anzahl_h+1)::varchar|| ' von ' || (coalesce(tab2.z_1,0) + coalesce(tab2.z_2,0) + coalesce(tab2.z_3,0))::varchar as lfdnr
from tab2
LEFT JOIN (select Zehner+Einer as Anzahl_h,
           from (select
		      hE.Dummyzahl as Einer
       	   , 10* hZ.Dummyzahl as Zehner
	    	  from etk_hilfstabelle hE, etk_hilfstabelle hZ) subselect1
		  ) h on (coalesce(tab2.z_1,0) + coalesce(tab2.z_2,0) + coalesce(tab2.z_3,0))::numeric >= (h.Anzahl_h+1)::numeric
order by plz,name,zust

Wenn ihr noch Informationen benötigt, sagt bescheid

So ganz verstehe ich Dein Problem nicht. Was ist sehe ist aber ein ungünstiges Tabellendesign. Für die z - Spalten wäre BOOL besser. Noch besser wäre eine korrekte Normalisierung - was machst Du, wenn eine weitere Zeitschrift dazukommt?

Mit Deinen Daten (aber nur den nötigsten Spalten) und Prüfung auf z1 und z3:

test=*# select * from marius ;
 name  | z1 | z2 | z3 
-------+----+----+----
 käse  | t  | f  | t
 käse  | t  | f  | t
 trink | f  | t  | f
(3 Zeilen)

test=*# select *, row_number() over (partition by name) as "Zeile", count(*) over (partition by name) as "von Gesamt" from marius where z1 or z3;
 name | z1 | z2 | z3 | Zeile | von Gesamt 
------+----+----+----+-------+------------
 käse | t  | f  | t  |     1 |          2
 käse | t  | f  | t  |     2 |          2
(2 Zeilen)