Autor Beitrag
julia24
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mi 04.02.15 09:17 
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:
ausblenden 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
ausblenden 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
ausblenden 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:
ausblenden 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 user profile iconTh69: Code- und C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
var validSales = from sale in sales					

//Hier verbinde ich dann zur Produkt Tabelle, damit ich nur die habe die Aktiv sind
ausblenden 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.
ausblenden 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 user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 (im anderen Forum kann es sein, daß dein Thema deswegen geschlossen wird).