Müssen Bericht mit der Anzahl der Spalten abhängig vom Parameter des datesbereichs erstellen

Ich bin ein ziemlich Neuling mit SQL. Ich arbeite gerade an einer Oracle-database und habe einen Bericht erstellt, der data abhängig vom Parameter für den timeraum aufruft.

Der Code ist wie folgt:

SELECT DISTINCT C.CUSTOMER_CODE , MS.SALESMAN_NAME , SUM(C.REVENUE_AMT) Rev_Amt FROM C_REVENUE_ANALYSIS C , M_CUSTOMER_H MC , M_SALESMAN MS WHERE C.COMPANY_CODE = 'W1' AND C.CUSTOMER_CODE = MC.CUSTOMER_CODE AND MC.SALESMAN_CODE = MS.SALESMAN_CODE AND trunc(C.REVENUE_DATE) between to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') AND MS.COMPANY_CODE = '00' GROUP BY C.CUSTOMER_CODE, MS.SALESMAN_NAME ORDER BY C.CUSTOMER_CODE, MS.SALESMAN_NAME 

Der resultierende Bericht für einen timeraum vom 1. Januar bis 30. April lautet:

 +-----------+--------------+--------------+ |Customer |Salesman Name |Revenue Amount| +-----------+--------------+--------------+ |Customer 1 |Salesman 1 | 5000.00| +-----------+--------------+--------------+ |Customer 2 |Salesman 1 | 8000.00| +-----------+--------------+--------------+ |Customer 3 |Salesman 2 | 300.00| +-----------+--------------+--------------+ |Customer 4 |Salesman 3 | 600.00| +-----------+--------------+--------------+ |Customer 5 |Salesman 3 | 5000.00| +-----------+--------------+--------------+ |Customer 6 |Salesman 3 | 8000.00| +-----------+--------------+--------------+ |Customer 7 |Salesman 4 | 9000.00| +-----------+--------------+--------------+ |Customer 8 |Salesman 5 | 2000.00| +-----------+--------------+--------------+ |Customer 9 |Salesman 6 | 1000.00| +-----------+--------------+--------------+ |Customer10 |Salesman 6 | 5000.00| +-----------+--------------+--------------+ |Customer11 |Salesman 7 | 6000.00| +-----------+--------------+--------------+ |Customer12 |Salesman 8 | 8000.00| +-----------+--------------+--------------+ 

Hier bitte brauche ich deine Hilfe. Ich muss eine Aufteilung der Einnahmen für jeden Verkäufer für jeden Monat zwischen Januar bis April zeigen.

Also möchte ich, dass das Ergebnis so aussieht:

 +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer |Salesman Name |Rev for Jan|Rev for Feb|Rev for Mar|Rev for Apr|Total Rev Amt| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 1 |Salesman 1 | 1000.00| 1000.00| 1000.00| 2000.00| 5000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 2 |Salesman 1 | 2000.00| 2000.00| 2000.00| 2000.00| 8000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 3 |Salesman 2 | 100.00| 0.00| 100.00| 100.00| 300.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 4 |Salesman 3 | 100.00| 200.00| 100.00| 200.00| 600.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 5 |Salesman 3 | 1000.00| 2000.00| 1000.00| 1000.00| 5000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 6 |Salesman 3 | 1000.00| 2000.00| 1000.00| 4000.00| 8000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 7 |Salesman 4 | 2000.00| 2000.00| 3000.00| 2000.00| 9000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 8 |Salesman 5 | 500.00| 400.00| 500.00| 600.00| 2000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer 9 |Salesman 6 | 200.00| 200.00| 200.00| 400.00| 1000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer10 |Salesman 6 | 1000.00| 1000.00| 2000.00| 1000.00| 5000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer11 |Salesman 7 | 2000.00| 2000.00| 1000.00| 1000.00| 6000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ |Customer12 |Salesman 8 | 2000.00| 2000.00| 2000.00| 2000.00| 8000.00| +-----------+--------------+-----------+-----------+-----------+-----------+-------------+ 

Da ich ein Neuling bin, habe ich leider keine Rechte, eine Stored Procedure zu erstellen, um diese data regelmäßig aufzurufen. Also muss ich möglicherweise redundanten Code schreiben.

Aber die Frage ist wirklich, was wäre der Code, um die Einnahmen pro Monat pro Verkäufer aufschlüsseln zu können?

Die Anzahl der Spalten hängt vom datesbereich ab. Z.B; Wenn Jan bis April ausgewählt ist, erhalte ich 4 Spalten für den Umsatz plus 1 Spalte für den Gesamtumsatz. Wenn der Oktober des letzten Jahres zu diesem Jahr ausgewählt wird, erhalte ich 7 Spalten für den Umsatz plus 1 Spalte für den Gesamtumsatz.

BITTE kann jemand einem Anfänger helfen, der begierig ist, zu lernen und sich zu bewähren? Ich würde Ihre Hilfe sehr schätzen. Vielen Dank im Voraus.

EDIT:

Nach ein wenig Überredung hat mein Vorgesetzter zugestimmt, mein gespeichertes Verfahren zur Genehmigung einzureichen, und wenn es genehmigt wird, wird es erstellt.

Wenn ich eine gespeicherte Prozedur erstellen kann, wie lautet der Code, um das gewünschte Ergebnis zu erhalten?

Danke im Voraus.

Solutions Collecting From Web of "Müssen Bericht mit der Anzahl der Spalten abhängig vom Parameter des datesbereichs erstellen"

Schau dir die Pivot-function http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html an

Der hässliche Teil ist, dass Sie die geschwenkten Säulen im Voraus kennen müssen (in Ihrem Fall die Monate in dem ausgewählten Bereich). Eine mögliche Lösung dafür ist das Erstellen einer dynamischen SQL-statement mit PLSQL, aber Sie müssen möglicherweise nicht über die richtigen Rechte verfügen, um sie auszuführen. Sie erwähnen in Ihrem Beitrag, dass Sie keine Prozeduren erstellen können (ich nehme an, Sie haben nicht die CREATE PROCEDURE-Zuteilung), aber nicht sicher, ob das die einzige Zuteilung ist, die Ihnen fehlt.

Eine case-statement kann in der Summe ähnlich der Pivot-statement funktionieren.

 SELECT DISTINCT C.CUSTOMER_CODE , MS.SALESMAN_NAME , SUM(C.REVENUE_AMT) Rev_Amt ,CASE WHEN trunc(C.REVENUE_DATE) between to_date('1 jan 2014','YYYYMMDD') and to_date('31 jan 2014','YYYYMMDD') THEN SUM(C.REVENUE_AMT) ELSE 0 END AS Revenue_Jan_2014 FROM C_REVENUE_ANALYSIS C , M_CUSTOMER_H MC , M_SALESMAN MS WHERE C.COMPANY_CODE = 'W1' AND C.CUSTOMER_CODE = MC.CUSTOMER_CODE AND MC.SALESMAN_CODE = MS.SALESMAN_CODE AND trunc(C.REVENUE_DATE) between to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD') AND MS.COMPANY_CODE = '00' GROUP BY C.CUSTOMER_CODE, MS.SALESMAN_NAME ORDER BY C.CUSTOMER_CODE, MS.SALESMAN_NAME 

Aber wie bei der Antwort von xionutz2k erfordert dies auch die Kenntnis der spezifischen Spalten.

Sie können beginnen, Dynamics SQL zu verwenden, aber das kann hässlich werden. Hier finden Sie einen Verweis zur Verwendung von Dynamic SQL.

Dynamisches SQL zum Generieren von Spaltennamen?

Eine andere Lösung:

 select a.cust, a.salesman, (select sum(b.revenue) from rev b where a.cust=b.cust and a.salesman=b.salesman and tr_date between to_date('1 jan 2014','YYYYMMDD') and to_date('31 jan 2014')) Jan_Rev, (select sum(c.revenue) from rev c where a.cust=c.cust and a.salesman=c.salesman and tr_date between to_date('1 feb 2014','YYYYMMDD') and to_date('28 feb 2014')) feb_Rev, (select sum(d.revenue) from rev d where a.cust=d.cust and a.salesman=d.salesman and tr_date between to_date('1 mar 2014','YYYYMMDD') and to_date('31 mar 2014')) mar_Rev ... and so on for more months.. from cust_table a where .. add where clause if any ...