Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Unterabfrage group by
julia24 - Mi 04.02.15 09:17
Titel: Unterabfrage group by
Hallo,
ich versuche gerade eine Abfrage aus meiner SQL Datenbank zu implementieren.
Leider habe ich ein Problem dabei, dass sich wie folgt gestaltet:
Hier mal ein Beispiel, dass meinem ähnelt.
Tabelle Produkt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ProduktId Produkt IsActive DeleteDate
1 Hammer 1 250115
2 Meisel 1 250115
3 Nagel 1 250115
4 Schraube 0 250115
5 Laim 0 240115 |
Verkauf
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| VerkaufId Kunde ProduktId NichtRückläufig GrundRückläufig
10 Siggi 1 1 1 null
12 Franz 2 2 1 null
13 Bernd 3 3 null 5 10 Bea 1 4 null 5
12 Sabine 2 1 1 null 12 Sabine 2 1 null 5 13 Tanja 3 2 null 8 |
Ausgabe:
Verkaufstatistik
Quelltext
1: 2: 3: 4: 5:
| ProduktId NichtRückläufig Rückläufig5 Rückläufig8 1 2 1 0 2 1 0 1 Etc… |
Jetzt will ich eine neue Tabelle machen.
Die nenne ich mal Verkaufsstatistik.
Da möchte ich nun:
1. Erstmal alle rausfiltern die nicht mehr aktiv sind (IsActive =1)
2. Aus diesen dann nur die in einem bestimmten Zeitintervall
3. Und dann nach den Gründen sotiert zählen, dass ganze aber gruppiert bei den ProduktIds
Normalerweise würde ich so anfangen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var validSales = from sale in sales join product in products on sale.ProductId equals product.Id where sale.IsValid && product.IsActive && (product.DeleteDate - baseDate).Days >= 0 select sale;
foreach (var sale in validSales) Console.WriteLine(sale.Id + " " + sale.Name + " " + sale.ProductId + " " + sale.IsValid); |
Aber ich weiß nicht wie es weitergehen soll…
Moderiert von
Th69: Code- und C#-Tags hinzugefügt
Ralf Jansen - Mi 04.02.15 11:01
Kannst du dein Frage etwas überarbeiten? So ist die schwer zu durchschauen da du die Tabellen scheinbar eingedeutsch hast obwohl dein Modell anhand deiner LINQ Abfrage eher nach englisch aussieht. Ich tu mich da zumindest schwer den Zusammenhang zu sehen.
julia24 - Mi 04.02.15 12:01
Ja ok klar.
Also sales soll den verkauf darstellen. Aus dieser Tabelle hole ich die Daten für meine statistik.
C#-Quelltext
1:
| var validSales = from sale in sales |
//Hier verbinde ich dann zur Produkt Tabelle, damit ich nur die habe die Aktiv sind
C#-Quelltext
1: 2: 3:
| product.IsActive join product in products on sale.ProductId equals product.Id select sale; |
// Bis hierhin müsste es die Abfrage sein um alle die Produkte zu filtern die aktiv sind.
C#-Quelltext
1: 2:
| foreach (var sale in validSales) Console.WriteLine(sale.Id + " " + sale.Name + " " + sale.ProductId + " " + sale.IsValid); |
Aber wie verbinde ich das nun am Klügsten?
Moderiert von
Th69: C#-Tags hinzugefügt
Th69 - Mi 04.02.15 15:04
Hallo und :welcome:
so wie ich das verstehe, möchtest du Spalten generieren (z.B. "Rückläufig5"), welche aus den Zeileninhalten heraus ermittelt werden sollen. Dies geht mit SQL (bzw. LINQ) nicht direkt.
Du wirst die Abfrage in mehrere Teilschritte unterteilen müssen:
- Ermittle alle verschiedenen Einträge für jeweils "NichtRückläufig" und "GrundRückläufig" (z.B. mittels einer DISTINCT-Anweisung)
- Generiere dir eine Tabelle (oder aber wenn es nur für die Ausgabe ist, kannst du es on-the-fly durchführen) mit den jeweiligen Spalten
- dann führe eine entsprechende Abfrage (wie du sie schon hast) für die einzelnen ProduktIds mit den jeweiligen "Rückläufig"-Einträgen durch (Gruppieren kannst du per
group by)
- Trage die Anzahl der Abfrage jeweils in die entsprechende Spalte der Tabelle aus (bzw. gib den Wert direkt aus)
PS: Bitte verwende demnächst selber die Code- bzw. C#-Tags beim Erstellen eines Beitrags.
Und Crossposts solltest du hier immer angeben:
myCSharp.de - Select Unterabfrage group by problem [
http://www.mycsharp.de/wbb2/thread.php?threadid=113785] (im anderen Forum kann es sein, daß dein Thema deswegen geschlossen wird).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!