2012-03-29 3 views
1
변수

를 사용하여 하나의 열을 기준으로 행과 그룹을 표시합니다. 같은 SalesOrderID와 제품 분류 및 계산 될 수 있도록사용 커서 내가 두 개의 테이블이

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

: 어떻게 내가 좋아하는 뭔가를 인쇄 할 수 있습니까? 이 내가 커서 뭐가이다 : 나는 다음 각 행에 대해 1로 처음 @numdetail를 설정 곳이 때문에 BEGIN 이후의 생각

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

:처럼 내 결과가 보이는 무엇

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 

그것을 1로 더하십시오. 동일한 제품을 그룹화하고 계산하는 방법을 궁금합니다. SalesOrderID?

답변

1

당신은 그것을 위해 모든 커서를 필요로하지 말아야 ...

이 대신 (주문 당 항목 수 얻기 위해 사용 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 

을 코드 자체를 시도 했으므로 일부 구문 오류가있을 수 있습니다. 그러나 요점을 얻으시기 바랍니다.

또한 상태를 자체 테이블에 두어야합니다 ... ID 열이없는 테이블을 사용하고 다음과 같이 사용하십시오. 조회 테이블.

+0

고마워요! 그것은 매우 도움이되었습니다. –