используйте курсор для отображения строк и группируйте их по одному столбцу, используя переменную - PullRequest
1 голос
/ 29 марта 2012

У меня есть две таблицы:

Sales.SalesOrderHeader(SalesOrderID(PK), SalesOrderNumber, Status,..)
Sales.SalesOrderDetail(SalesOrderID(PK,FK), ..)

Я объявил переменную @numdetail и курсор SaleReportCursor.Как я могу напечатать что-то вроде:

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

, чтобы продукты с одинаковым SalesOrderID можно было группировать и подсчитывать?Вот что я получил за Курсор:

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 =@salesOrderNum
set @numDetail=@numDetail+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 @count=@count+1
Print @message
FETCH NEXT from salesReportCursor
INTO @salesOrderID, @salesOrderNum , @status; 
END

CLOSE salesReportCursor
DEALLOCATE salesReportCursor

Как выглядит мой результат:

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

Я думаю, это было из-за того, что после НАЧАЛА, где я изначально установил @numdetail1 для каждой строки, затем добавьте ее на 1. Интересно, как группировать и считать продукты с одинаковыми SalesOrderID?

1 Ответ

1 голос
/ 29 марта 2012

Для этого вам вообще не нужен курсор ...

Попробуйте вместо этого (используйте COUNT, чтобы получить количество товаров в заказе):

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

(IЯ сам не пробовал код, поэтому могут быть некоторые синтаксические ошибки, но я надеюсь, что вы поняли)

Вы должны также поместить статусы в свою собственную таблицу ... Желательно таблицу без идентификатора столбцаи используйте его в качестве справочной таблицы.

...