2012-03-29 2 views
1

Ich habe zwei Tabellen angezeigt werden soll. Wie kann ich Drucken so etwas wie:Verwendung Cursor sie Zeilen und Gruppe, die durch eine Spalte mit variabler

SalesOrderNumber1 (3 items) was shipped. 
    SalesOrderNumber2 (4 items) was shipped. 
    SalesOrderNumber3 (2 items) was shipped. 

so dass Produkte mit den gleichen SalesOrderID gruppiert werden können und gezählt? Diese ist das, was ich für den Cursor bekam:

DECLARE 
@salesOrderID INT, 
@salesOrderNum NVARCHAR(25), 
@dueDate DATETIME, 
@status tinyint, 
@message varchar(80), 
@numDetail INT, 
@count INT = 0, 
@astatus varchar(10);  
DECLARE salesReportCursor CURSOR 
FOR 
select s.SalesOrderID, SalesOrderNumber,DueDate, Status 
FROM [Sales].[SalesOrderDetail] s 
join Sales.SalesOrderHeader h 
on s.SalesOrderID=h.SalesOrderID 
where 
h.DueDate between '2008-08-01' and '2008-08-31' 
group by SalesOrderNumber,s.SalesOrderID,DueDate, Status 
Order by SalesOrderNumber desc 
FOR READ ONLY 

OPEN salesReportCursor 

FETCH NEXT from salesReportCursor 
INTO @salesOrderID, @salesOrderNum , @dueDate , @status; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
set @numDetail= 1 
if @salesOrderNum [email protected] 
set @[email protected]+1 
Set @astatus= 
case when @status=1 then 'In process' 
    when @status=2 then 'Approved' 
    when @status=3 then 'Backordered' 
    when @status=4 then 'Rejected' 
    when @status=5 then 'Shipped' 
    when @status=6 then 'Cancelled' 
    end 
Select @message=cast(@salesOrderNum as varchar) 
+' ('+ cast(@numDetail as varchar)+' items) due '+ 
cast(@dueDate as varchar) +' is '+ @astatus 
set @[email protected]+1 
Print @message 
FETCH NEXT from salesReportCursor 
INTO @salesOrderID, @salesOrderNum , @status; 
END 

CLOSE salesReportCursor 
DEALLOCATE salesReportCursor 

Was mein Ergebnis wie folgt aussieht:

SalesOrderNumber1 (2 items) was shipped. 
    SalesOrderNumber2 (2 items) was shipped. 
    SalesOrderNumber3 (2 items) was shipped. 

Ich denke, das wegen war nach dem BEGIN, wo ich @numdetail zunächst als 1 für jede Zeile stellen Sie dann addiere es durch 1. Ich frage mich, wie man Produkte mit demselben SalesOrderID gruppiert und zählt?

Antwort

1

Sie sollten nicht einen Cursor auf allen für die mehr brauchen ...

Versuchen Sie diese statt (Verwendung COUNT Anzahl der Elemente pro Auftrag zu erhalten):

select 
    SalesOrderNumber + ' (' + CONVERT(varchar, COUNT(*)) + ' items) due ' + CONVERT(varchar, h.DueDate, 20) + ' is ' + Statuses.Name 
FROM 
    [Sales].[SalesOrderDetail] s 
    join Sales.SalesOrderHeader h 
     on s.SalesOrderID=h.SalesOrderID 
    join (
     select 1 as Status, 'In process' as Name 
     union all select 2, 'Approved' 
     union all select 3, 'Backordered' 
     union all select 4, 'Rejected' 
     union all select 5, 'Shipped' 
     union all select 6, 'Cancelled' 
    ) Statuses on 
     Statuses.Status = h.Status 
where 
    h.DueDate between '2008-08-01' and '2008-08-31' 
group by 
    h.SalesOrderNumber, 
    s.SalesOrderID, 
    h.DueDate, 
    h.Status 
Order by 
    h.SalesOrderNumber desc 

(Ich habe nicht versuchte den Code selbst, so könnte es einige Syntaxfehler geben, aber ich hoffe, Sie bekommen den Punkt)

Sie sollten auch die Status in eine eigene Tabelle setzen ... Vorzugsweise eine Tabelle ohne eine Identitätsspalte, und verwenden Sie sie als eine Nachschlagetabelle.

+0

Danke! Das war sehr hilfreich. –

Verwandte Themen