SQL Statement

17. Mai 2010 09:42

Hallo

EIgentlich gehört diese Frage nicht unbedingt in dieses Forum.
Ich erlaube mir trotzdem, diese Frage einmal zu stellen.

Die Anforderung ist folgende:
- Rangliste der "besten" 20 Artikel pro Kreditor (Basis Eink. Betrag)
- In der Selektion sollten 1 oder mehrere Keditoren gewählt werden können
- Als Zeitraum sollen 1 oder mehrer Jahre möglich sein.

Nun habe ich mir einmal ein SQL-Statement zusammengebastelt und mit Visual Studio ein Report für SQL-Report Services erstellt.
Code:
SELECT SUM(ve.[SUM$Cost Amount (Actual)]) AS 'Einkauf (MW`)',       
       vend.No_ AS 'Kreditorennr.',
       vend.Name AS 'Name',
       i.No_ AS 'Artikelnr.',
       i.Description AS 'Artikelbeschreibung',
       i.[Description 2] AS 'Artikelbeschreibung 2',       
       SUM(ile.SUM$Quantity) AS 'Lagerbestand',
       YEAR(ve.[Posting Date]) as Jahr       
       FROM [Mandant$Value Entry$VSIFT$7] ve
INNER JOIN [Mandant$Vendor] vend
ON vend.No_ = ve.[Source No_]
INNER JOIN [Mandant$Item] i
ON i.No_ = ve.[Item No_]
INNER JOIN [Mandant$Item Ledger Entry$VSIFT$5] ile
ON ile.[Item No_] = i.No_
WHERE ((ve.[Posting Date] BETWEEN (@StartDate) AND (@EndDate)) and
        (ve.[Source Type] = 2) and
        (ve.[Source No_] = @VendorFilter))
GROUP BY vend.No_, vend.Name, i.No_, i.Description, i.[Description 2], YEAR(ve.[Posting Date])


Mit diesem Skript habe ich nun die Artikel mit Betrag pro Kreditor. Aber leider alle :-(
Was ich nicht schnalle, wie bringe ich es fertig, dass nur die 20 besten TOP 20 Artikel erscheinen?

Bin für jeden "Wink" dankbar.

Viele Grüsse

Re: SQL Statement

17. Mai 2010 10:07

Wenn ich nicht ganz falsch liege, dann

Code:
SELECT TOP 20 SUM(ve.[SUM$Cost Amount (Actual)]) AS 'Einkauf (MW`)',       
       vend.No_ AS 'Kreditorennr.',
       vend.Name AS 'Name',
       i.No_ AS 'Artikelnr.',
       i.Description AS 'Artikelbeschreibung',
       i.[Description 2] AS 'Artikelbeschreibung 2',       
       SUM(ile.SUM$Quantity) AS 'Lagerbestand',
       YEAR(ve.[Posting Date]) as Jahr       
       FROM [Mandant$Value Entry$VSIFT$7] ve
INNER JOIN [Mandant$Vendor] vend
ON vend.No_ = ve.[Source No_]
INNER JOIN [Mandant$Item] i
ON i.No_ = ve.[Item No_]
INNER JOIN [Mandant$Item Ledger Entry$VSIFT$5] ile
ON ile.[Item No_] = i.No_
WHERE ((ve.[Posting Date] BETWEEN (@StartDate) AND (@EndDate)) and
        (ve.[Source Type] = 2) and
        (ve.[Source No_] = @VendorFilter))
GROUP BY vend.No_, vend.Name, i.No_, i.Description, i.[Description 2], YEAR(ve.[Posting Date])
ORDER BY SUM(ve.[SUM$Cost Amount (Actual)]) AS 'Einkauf (MW`)'


Volker

Re: SQL Statement

17. Mai 2010 10:15

Hallo Volker

Meinte ich auch. Ist aber nicht :-(
So erhalte ich aber einfach die 20 besten Artikel über alles mit den zugehörigen Kreditoren.
Ich sollte aber pro Keditor die besten Artikel erhalten.

Gruss

Re: SQL Statement

17. Mai 2010 11:04

Was mir spontan einfällt: Ein Select über alle Kreditoren und statt eines InnerJoins vielleicht ein SubSelect mit TOP 20 Artikeln.

Gruß,
Sebastian

Re: SQL Statement

17. Mai 2010 11:24

An genau so was grübel ich herum.
Ich sehe denn Weg im Moment einfach nicht.

Gruss

Re: SQL Statement

18. Mai 2010 07:58

Hallo,
wie ich das sehe, müsstet Ihr hier wahrscheinlich mit einem Cursor arbeiten. Der Code sollte vermutlich dann so aussehen:
Code:
DECLARE @Nr varchar(20), @Name varchar(50)
DECLARE MyCursor CURSOR FOR
SELECT [No_], Name FROM [CRONUS AG$Vendor]
OPEN MyCursor
FETCH NEXT FROM MyCursor
INTO @Nr, @Name
WHILE @@FETCH_STATUS = 0
   BEGIN
     SELECT TOP 20 SUM(ve.[SUM$Cost Amount (Actual)]) AS 'Einkauf (MW`)',       
       @Nr AS 'Kreditorennr.',
       @Name AS 'Name',
       i.No_ AS 'Artikelnr.',
       i.Description AS 'Artikelbeschreibung',
       i.[Description 2] AS 'Artikelbeschreibung 2',       
       SUM(ile.SUM$Quantity) AS 'Lagerbestand',
       YEAR(ve.[Posting Date]) as Jahr       
     FROM [CRONUS AG$Value Entry$VSIFT$7] ve
     INNER JOIN [CRONUS AG$Vendor] vend
       ON vend.No_ = ve.[Source No_]
     INNER JOIN [CRONUS AG$Item] i
       ON i.No_ = ve.[Item No_]
     INNER JOIN [CRONUS AG$Item Ledger Entry$VSIFT$5] ile
       ON ile.[Item No_] = i.No_
     WHERE ((ve.[Posting Date] BETWEEN (@StartDate) AND (@EndDate))
        and (ve.[Source Type] = 2) and  (ve.[Source No_] = @Nr))
     GROUP BY vend.No_, vend.Name, i.No_, i.Description, i.[Description 2], YEAR(ve.[Posting Date])
     ORDER BY SUM(ve.[SUM$Cost Amount (Actual)])
   FETCH NEXT FROM MyCursor INTO @Nr, @Name
   END;
CLOSE MyCursor;
DEALLOCATE MyCursor;
GO

Re: SQL Statement

18. Mai 2010 08:37

Hallo Korodamos

Ich glaube damit könnte es gehen.
Nun muss ich einmal versuchen, ob ReportingServices mit so einem Script etwas anfangen kann.
Cursor in Zusammenhang mir ReportingServices habe ich noch nie verwendet.

ich schaue mir das heute mal an.

Vielen Dank auf jeden Fall schon mal.

Gruss