verwendetes Datenbanksystem: ORACLE / SQL Server
Hallo Forum
Die Frage geht ganz grundsätzlich um SQL, gerne nehme ich auch links zu spezialisierten Foren entgegen, sollte das Thema hier nicht passen.
Es geht um die gestaltung eines Reports und die Datenerhebung mittels SQL.
Der Report soll immer für 6 Tage die Anzahl der Bestellungen eines Produktes darstellen können. (Ist Vereinfacht, also nicht Anzahl Produkte!)
Darstellung im Report
Produkt - Tag1 - Tag2 - Tag3 - Tag4 - Tag5 - Tag6
Prod.A - 2 - 5 - 2 - 9 - 5 - 7
Prod.B - 2 - 2 - 2 - 3 - 5 - 5
Prod.n - 2 - 5 - 2 - 5 - 8 - 5
Die Query:
select * from Produkt
join Bestellung on Bestellung.Produktid = Produkt.Id
where Bestellung.Datum ≥ 1.7.2010 and Bestellung.Datum ≤ 6.7.2010
Gibt es einen Ansatz, dass ich nun das Resultat nicht nur "vertikal" sondern auch "horizontal" auf die Tage/Datum bekommen kann? Die 6 Wochentage sind ja immer gegeben...
Vielen Dank für Tipps und Hinweise
kaepten
Hallo,
mehr als einen Tipp kann ich dir leider nicht geben. Aber der wäre PIVOT (bei SQL Server zusätzlich auch Common Table Expression (CTE)).
Edit: Mit den Reporting Services können Pivot-Tabelle einfacher erstellt werden.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Ich würde eine Aggregationstabelle erstellen.
Danke für euer Antworten.
spacenet, das würde ich momentan so im DataSet mache. Denn die Daten werden ohnehin als DataSet dem Report übergeben. So würde ich also das ursprüngliche Resultat im Code nochmals verwurschteln und dann ins DataSet in der Form abfüllen. Kommt Deinem Ansatz denke ich gleich, einfach dass es kein DB-Ansatz ist.
Hallo,
hab oben noch ein Edit für Reporting Services hinzugefügt. Wäre das eine Option?
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
hiho
Ich muss Datenbank-Unabhängig bleiben... also reines SQL oder dann halt im Code mit C#
HI,
also erst mal muss ich dich Fragen, wieviele Produkte gibt es.
Wieviele Bestellungen kann es Pro Tag geben und wieviel Rows hast du in der Tabelle?
Wie fett ist deine Hardwäre? Bleibt Sie immer unter 50% Auslasung?
Dann kannst du anhand dieser Zahlen eine abschätzung und Test machen.
Endweder machst du es Live oder aber per CronJob einmal in der Nacht.
Für das SQL brauch ich die Tabellen Strucktur.
MfG
Björn
Das Leben ist schön!
Hi Viper
Das echte Problem ist etwas komplexer, ich dachte nur das Produkt-Bestellungs Beispiel kann jeder nach vollziehen und anhand dessen eine mögliche Lösung aufzeigen. Es muss auf jeden Fall Live ausgeführt werden...
Gehen wir mal vereinfach von dem hier aus:
Bestellung:
[Id], [Datum], [ProduktId], [KundenId]
Produkt:
[Id], [Name]
Danke für die Anwort!
Ein SQL könnte so aussehen:
Oracle Syntax:
CREATE VIEW V_Bestellung_Count
SELECT Datum, ProduktID, Count(ProduktID) as Anzahl FROM Bestellung
GROUP BY Datum, ProduktID
;
SELECT ProduktName , Sum(Tag1) as Tag1, SUm(Tag2) as Tag2, Sum(Tag3) as Tag3 FROM
(
SELECT p.ProduktName,
p.ProduktID,
b.Anzahl as Tag1,
0 as Tag2,
0 as Tag3
FROM Produkt P , V_Bestellung_Count B
WHERE B.ProduktID = P.ID
AND B.Datum = TO_DATE('01.07.2010', 'DD:MM:YYYY')
UNION
SELECT p.ProduktName,
p.ProduktID,
0 as Tag1,
b.Anzahl as Tag2,
0 as Tag3
FROM Produkt P , V_Bestellung_Count B
WHERE B.ProduktID = P.ID
AND B.Datum = ( TO_DATE('01.07.2010', 'DD:MM:YYYY') + 1)
UNION
SELECT p.ProduktName,
p.ProduktID,
0 as Tag1,
0 as Tag2,
b.Anzahl as Tag3
FROM Produkt P , V_Bestellung_Count B
WHERE B.ProduktID = P.ID
AND B.Datum = ( TO_DATE('01.07.2010', 'DD:MM:YYYY') + 2)
) Temp
GROUP BY ProduktID, ProduktName
Das funktioniert auch Performant.
Generell ist das aber für Pivot-Tabellen und ReportingService.
MfG
Björn
PS: Das einrücken mit TAB wird immer zuerschossen beim speichern.... Sorry
Das Leben ist schön!
Ich konnte es prima an meinen echten Daten nachvollziehen.
Besten Dank für Deine Antwort!