# Kreuztabelle



## LarryKante (9. April 2007)

Hi,
Ich hab ein problem mit der korrekten Darstellung(also so wie ich es eigentlich haben möchte ^^) meiner Kreuztabelle...

Folgende Situation:

Ich besitze 2 tabellen in einer Datenbank (phpMyAdmin auf einem Server) um artikel zu verwalten:
Die erste Tabelle ist die Artikel Tabelle. Darin stehen die wichtigsten Information über jeden einzelnen Artikel. Jeder Artikel gehört einer Artikelgruppe an und besitzt eine eigene ArtikelID und ist unterteilt in Farben grössen.
D.h. ich arbeite in 3 Dimensionen: Gruppe, Grösse, Farbe.



Die zweite Tabelle ist die Auftragsposition Tabelle. Darin werden die Gruppe, die ID, Name, und zu einem Eintrag zusammengefasst die Farbe und Grösse (das muss auch so bleiben!) sowie die Menge erfasst.



*Der code für die Artikeltabelle:*

```
-- 
-- Tabellenstruktur für Tabelle `artik_pos`
-- 

CREATE TABLE `artik_pos` (
  `id` int(10) NOT NULL auto_increment,
  `artnr` varchar(255) NOT NULL default '',
  `artid` varchar(255) NOT NULL default '',
  `bez1` varchar(255) NOT NULL default '',
  `bez2` varchar(255) NOT NULL default '',
  `look` varchar(255) NOT NULL default '',
  `menge` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 ;

-- 
-- Daten für Tabelle `artik_pos`
-- 

INSERT INTO `artik_pos` VALUES (1, 'E07664', 'bbb-aaa-111', 'Anouch', 'noir, T1', '133', '2');
INSERT INTO `artik_pos` VALUES (2, 'E07664', 'bbb-aaa-222', 'Anouch', 'noir, T2', '133', '1');
INSERT INTO `artik_pos` VALUES (3, 'E07221', 'aaa-bbb-111', 'Manou', 'blanc, 32', '122', '2');
INSERT INTO `artik_pos` VALUES (4, 'E07222', 'aaa-bbb-222', 'Mandy', 'blanc, 34', '110', '2');
INSERT INTO `artik_pos` VALUES (5, 'E07222', 'aaa-ccc-111', 'Mandy', 'ficelle, 34', '110', '1');
```

*Der code für die Auftragspositionstabelle:*

```
-- 
-- Tabellenstruktur für Tabelle `artik_pos`
-- 

CREATE TABLE `artik_pos` (
  `id` int(10) NOT NULL auto_increment,
  `artnr` varchar(255) NOT NULL default '',
  `artid` varchar(255) NOT NULL default '',
  `bez1` varchar(255) NOT NULL default '',
  `bez2` varchar(255) NOT NULL default '',
  `look` varchar(255) NOT NULL default '',
  `menge` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 ;

-- 
-- Daten für Tabelle `artik_pos`
-- 

INSERT INTO `artik_pos` VALUES (1, 'E07664', 'bbb-aaa-111', 'Anouch', 'noir, T1', '133', '2');
INSERT INTO `artik_pos` VALUES (2, 'E07664', 'bbb-aaa-222', 'Anouch', 'noir, T2', '133', '1');
INSERT INTO `artik_pos` VALUES (3, 'E07221', 'aaa-bbb-111', 'Manou', 'blanc, 32', '122', '2');
INSERT INTO `artik_pos` VALUES (4, 'E07222', 'aaa-bbb-222', 'Mandy', 'blanc, 34', '110', '2');
INSERT INTO `artik_pos` VALUES (5, 'E07222', 'aaa-ccc-111', 'Mandy', 'ficelle, 34', '110', '1');
```

Folgendermaßen frage ich nun meine Tabelle ab:

```
SELECT artik_pos.bez1, artikel.bez2, 
(SELECT COUNT(artik_pos.menge) FROM artik_pos WHERE artikel.groesse = "32") AS Gr32,
(SELECT COUNT(artik_pos.menge) FROM artik_pos WHERE artikel.groesse = "34") AS Gr34, 
(SELECT COUNT(artik_pos.menge) FROM artik_pos WHERE artikel.groesse = "38") AS Gr38, 
(SELECT COUNT(artik_pos.menge) FROM artik_pos WHERE artikel.groesse = "42") AS Gr42,  
(SELECT COUNT(artik_pos.menge) FROM artik_pos WHERE artikel.groesse = "T2") AS T2,
(SELECT COUNT(artik_pos.menge) FROM artik_pos WHERE artikel.groesse = "T1") AS T1
FROM artik_pos
LEFT JOIN artikel ON artikel.artid = artik_pos.artid
GROUP BY artik_pos.artid ORDER BY artik_pos.bez1
```

Folgende Tabelle wird ausgegeben



Nun das Problem: Wie Ihr seht kommt überall wo die Menge steht eine 5 heraus  . Ich weis nur nicht welche abfrage ich nutzen kann um den realen Wert aus der _artik_pos_ zu bekommen. *SUM(artik_pos.menge)* ergibt eine 8 was logischerweise zusammengerechnet der Wert aller Mengen in der _artik_pos_ ist. Verwende ich jedoch nur *artik_pos.menge* wird ein Syntax Error ausgegeben...

Ich weis nun echt nich mehr weiter. Hab schon gesucht aber nix passendes gefunden...

Hab schnell doch nochmal gesucht und etwas gefunden in einem anderem Thread!
Dort hatte einer fast das gleiche Problem. Er löste es mir dem *distinct* befehl.
Das hab ich auch gleich probiert!

```
(SELECT COUNT(distinct artik_pos.menge) FROM artik_pos WHERE artikel.groesse = "T1") AS T1,
(SELECT COUNT(distinct artik_pos.menge) FROM artik_pos WHERE artikel.groesse = "T2") AS T2,
//usw...
```
Jetzt bekomm ich überall eine 2 heraus! Das liegt daran, dass der höchste Wert in der Spalte _menge_ in der Tabelle _artik_pos_ eine 2 ist. Ist es eine 3 kommt überall 3 heraus. Muss ich die einzelnen Mengen abfragen evtl. als Array deklarieren und jedes mit eigener Id speichern? 

Welche Möglichkeit besteht?

Kann mir bitte jemand weiterhelfen!


----------



## LarryKante (10. April 2007)

Hat denn keiner ne ahnung davon?

Irgendeinen Ansatz? und  bringt auch nix vernünftiges


----------



## melmager (10. April 2007)

Und was möchtes du erreichen ?

was soll denn gezählt werden - das habe ich noch nicht verstanden :-(


----------



## LarryKante (10. April 2007)

Die menge aus der artik_pos soll entsprechend der grössen in der senkrechten, und die farben in der waagerechten geordnet werden! in den entsprechenden Zellen soll nun die menge eingetragen werden, die dem artikel entsprechen!

da die grösse und die farbe aber zusammen in einer spalte stehen, lässt sich eine kreuztabelle nicht vermeiden!

In der der artikel tabelle sind diese angaben getrennt eingetragen.

Die ausgabe soll halt so wie hier aussehen


nur halt die mengenangabe stimmt nicht!


----------

