2016-05-23 7 views
0

Ich habe ein Problem mit einer SQL-Abfrage. Ich brauche eine Liste aller eindeutigen [Cod Angajat] Felder, für die die Summe aller Einträge in der Spalte [Timp deklarat] kleiner als 8 ist, mit der Where-Klausel. Balg ist was ich bis jetzt bekommen habe.Wählen Sie unterschiedliche Werte aus, wenn die Bedingung sum <Wert

In der Tabelle habe ich 3 Zeilen. Sie gibt mir die gleichen Reihen, statt 1 Zeile, für Wich alle Bedingungen gelten - was bedeutet, das mit [Cod Angajat] = 2.

| Cod Angajat | Nume | Timp declarat | 
--------------------- 
| 1    | Ene  | 3    | 
| 1    | Ene  | 5    | 
| 2    | Gigi | 4    | 


select COUNT(DISTINCT [Cod Angajat]), [Cod Angajat], [Nume], [Timp declarat] 
FROM [SC Vermorel SRL$ProductieVE] 
WHERE (sum([Timp declarat] < 8 AND cast(CONVERT(varchar(8), Data, 112) As DateTime) = @data2) and ([Schimb] = '" & ProceseazaSCH(Now()) & "' 
GROUP BY [Nume], [Cod Angajat], [Timp declarat] 
HAVING sum([Timp declarat]) < 8 
+0

Tabellendaten, aktuelles Ergebnis und erwartetes Ergebnis anzeigen. – jarlh

+0

Sie gruppieren nach [Timp deklarat], dann funktioniert die Summenaggregation für Zeilen, in denen alle Feldwerte gleich sind. Sie müssen nur nach [Cod Angajat] und [Nume] gruppieren. – zequihg50

Antwort

0

Wenn Sie pro [Cod Angajat] eine Zeile benötigen, werden das sollte dann in der GROUP BY - und nichts anderes :

SELECT [Cod Angajat], SUM([Timp declarat] 
FROM [SC Vermorel SRL$ProductieVE] 
WHERE CONVERT(date, Data) = @data2 AND 
     ([Schimb] = '" & ProceseazaSCH(Now()) & "' 
GROUP BY [Cod Angajat] 
HAVING SUM([Timp declarat]) < 8; 

Der Rest der Abfrage vereinfacht auch. Es ist nicht erforderlich, ein Datum/eine Uhrzeit in eine Zeichenfolge zu konvertieren, um die Zeitkomponente zu entfernen. Aggregationsfunktionen gehören nicht in die WHERE-Klausel.

0

Mit der Abfrage, die Sie von Timp declarat Gruppierung sind, die ist, warum habe Duplikate von Cod Angajat in deinem Rückgabeset. Da überall sonst in der Abfrage die Summe von Timp Deklara- verwendet würde ich die folgenden nehmen ist, was Sie benötigen:

select COUNT(DISTINCT [Cod Angajat]), [Cod Angajat], [Nume], SUM([Timp declarat]) as SumTimpDeclarat 
FROM [SC Vermorel SRL$ProductieVE] 
WHERE (sum([Timp declarat] < 8 AND cast(CONVERT(varchar(8), Data, 112) As DateTime) = @data2) and ([Schimb] = '" & ProceseazaSCH(Now()) & "' 
GROUP BY [Nume], [Cod Angajat] 
HAVING sum([Timp declarat]) < 8 
+0

'code' SELECT [Cod Angajat], Summe ([Timp deklarat]) als TotalOre VON [SC Vermorel SRL $ ProductieVE] WHERE umgewandelt (CONVERT (varchar (8), Daten, 112) als DateTime) = '2016-05- 23 'Und [Schimb] =' SCH I 'GROUP BY [Cod Angajat] HAVING Summe ([Timp deklarat]) <8 'code' die Arbeitsabfrage. tks viel für Ihren wertvollen Input. –