sql服务器协助游标

时间:2012-04-02 02:13:44

标签: sql sql-server-2008

我对游标有疑问

问题是:对于2008年8月到期的所有订单,以下列格式显示其详细信息

OrderNumber (n items) due DueDate is Status

这是预期的输出

SO75123(3 items) due Aug 12 2008 12:00AM is Shipped

到目前为止我有这个

DECLARE
    @salesOrderID INT,
    @salesOrderNum NVARCHAR(20), 
    @dueDate DATETIME, 
    @status NVARCHAR(20), 
    @totalDue MONEY, 
    @numDetail INT,
    @count INT = 0;

DECLARE salesReportCursor CURSOR 
FOR
    SELECT Count(S.salesOrderID),p.SalesOrderNumber,p.Duedate, status =
        CASE  when p.status =1 THEN 'In Process'
            when p.status =2  THEN ' Approved'
            when p.status =3 THEN ' Backordered'
            when p.status =4 THEN ' Rejected'
            when p.status =5 THEN ' Shipped'
        END
    FROM Sales.SalesOrderHeader p, Sales.SalesOrderDetail s
    WHERE p.SalesOrderID=s.SalesOrderID AND  P.DueDate >= '2008' AND p.DueDate < '2009'
    Group by p.SalesOrderNumber,p.Duedate,status
    ORDER BY SalesOrderNumber DESC

我应该绕过360行,但是我会变成1400行。请告诉我,我的where子句中有什么错误导致错误。

我的数据库图片是http://www.2shared.com/photo/h2-jMQyP/AdventureWorks2008.html

1 个答案:

答案 0 :(得分:1)

使用这个简单的查询 - 你已经完成了 - 没有杂乱的游标或任何需要的东西!我从这里得到370行:

SELECT 
    Count(s.SalesOrderID), 
    p.SalesOrderNumber,
    p.DueDate, 
    OrderStatus =
    CASE  
        WHEN p.Status = 1 THEN 'In Process'
        WHEN p.Status = 2  THEN ' Approved'
        WHEN p.Status = 3 THEN ' Backordered'
        WHEN p.Status = 4 THEN ' Rejected'
        WHEN p.Status = 5 THEN ' Shipped'
    END
FROM 
    Sales.SalesOrderHeader p
INNER JOIN  
    Sales.SalesOrderDetail s ON p.SalesOrderID = s.SalesOrderID 
WHERE 
    -- restrict "DueDate" to between Aug 1st, 2008, and Aug 31st, 2008
    p.DueDate >= '20080801' AND p.DueDate < '20080901'
GROUP BY 
    p.SalesOrderNumber, p.DueDate, p.Status
ORDER BY 
    SalesOrderNumber DESC