PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   SQL / Datenbanken (https://www.php-resource.de/forum/sql-datenbanken/)
-   -   MySQL Abfrage mit unterschiedlichen Summen aus einer Spalte (https://www.php-resource.de/forum/sql-datenbanken/104468-mysql-abfrage-mit-unterschiedlichen-summen-aus-einer-spalte.html)

kriztan 24-01-2014 08:44

MySQL Abfrage mit unterschiedlichen Summen aus einer Spalte
 
Hallo, ich hoffe mir kann jemand bei meinem Vorhaben auf die Sprünge helfen. Ich habe folgende Tabelle mit diesen Spalten:

Datum | Kategorie_ID | Betreff | Betrag
--------------------------------------

In dieser Tabelle stehen hunderte Einträge aus verschiedenen Jahren. Nun möchte ich daraus eine Aufstellung der Preise/Kosten erstellen, gruppiert nach Kategorie und Jahr und das dann in einer folgenden Tabelle darstellen:

Kategorie_ID | Betrag 2014 | Betrag 2013
----------------------------------------

Soweit bin ich bis jetzt:

Code:

SELECT kategorie_name AS Kategorie, Kategorie_ID, SUM(Betrag) FROM kb_eintrag
LEFT JOIN kb_kategorie AS kategorie ON kategorie_ID = kb_eintrag.Kategorie
WHERE DATE_FORMAT(Datum, '%Y') = '2014'
AND Kategorie > 1
GROUP BY Kategorie_Name

Ich hab nun leider gar keine Idee, wie ich jetzt die Daten aus dem Jahr 2013 in dem Query mit verarbeiten und darstellen kann. Dazu kommt, dass eventuell nicht alle Kategorien in den beiden Jahren vorkommen, dann würden doch "Lücken" entstehen, oder?

Vielen Dank schon mal...
Grüße

pg_user 24-01-2014 09:04

Zitat:

Zitat von kriztan (Beitrag 668451)

In dieser Tabelle stehen hunderte Einträge aus verschiedenen Jahren. Nun möchte ich daraus eine Aufstellung der Preise/Kosten erstellen, gruppiert nach Kategorie und Jahr und das dann in einer folgenden Tabelle darstellen:

Du willst Zeilen zu Spalten machen. Das geht, erklärt z.B. hier:

https://www.pg-forum.de/viewtopic.php?f=66&t=4067

Das sollte prinzipiell ähnlich auch in MySQL gehen, beachte aber auch, was da noch so steht.

kriztan 26-01-2014 15:39

Ich hab es jetzt ganz anders gelöst. Für Interessierte:
Code:

SELECT kategorie_name AS Kategorie, Kategorie_ID,
SUM(IF(DATE_FORMAT(Datum, '%Y') = '".$jahr."' , Betrag, 0.00)) AS jahr,
SUM(IF(DATE_FORMAT(Datum, '%Y') = '".$vorjahr."' , Betrag, 0.00)) AS vorjahr
FROM kb_eintrag
LEFT JOIN kb_kategorie AS kategorie ON kategorie_ID = kb_eintrag.Kategorie
WHERE DATE_FORMAT(Datum, '%Y') >= '".$vorjahr."' and DATE_FORMAT(Datum, '%Y') <='".$jahr."'
AND Kategorie > 1
GROUP BY Kategorie_Name


pg_user 26-01-2014 15:48

Zitat:

Zitat von kriztan (Beitrag 668462)
Ich hab es jetzt ganz anders gelöst. Für Interessierte:
Code:

SELECT kategorie_name AS Kategorie, Kategorie_ID,
SUM(IF(DATE_FORMAT(Datum, '%Y') = '".$jahr."' , Betrag, 0.00)) AS jahr,
SUM(IF(DATE_FORMAT(Datum, '%Y') = '".$vorjahr."' , Betrag, 0.00)) AS vorjahr
FROM kb_eintrag
LEFT JOIN kb_kategorie AS kategorie ON kategorie_ID = kb_eintrag.Kategorie
WHERE DATE_FORMAT(Datum, '%Y') >= '".$vorjahr."' and DATE_FORMAT(Datum, '%Y') <='".$jahr."'
AND Kategorie > 1
GROUP BY Kategorie_Name


Genau so ist es richtig und der normale Weg.

Verbessern könntest bei Bedarf noch das WHERE: Da MySQL keine funktionalen Indexe kennt wird das aufgrund des date_format - rumgehampels als Fulltable-Scan laufen. Also entweder funktionale Indexe, was halt MySQL nicht kann, oder aber es als datum between ... and ... umschreiben.

kriztan 26-01-2014 15:49

Okay, vielen Dank für Dein Feedback


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:08 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG