我怎么能做到这一点?光标是否合适?

时间:2009-08-04 19:35:04

标签: sql tsql

我正在尝试使用TOAD和T-SQL来近似用户的电子表格。以下是他们想要的基本知识:

Order Number  Customer Name  June  July  Aug  Sept  Oct  Nov  Dec
12345        Bleh Company    1000
                                                    800  200  

第一行表示收到订单值的时间,第二行表示所述订单的预计发货日期。

以下SQL脚本提供此功能,但它不会在“订购日期”和“接收日期”之间切换。

SELECT 'O',  -- For Order Date
            (SOM.[fcustno] + ' - ' + SOM.[fcompany]) AS [Customer],
            sum(CASE month (SOM.forderdate)
                   WHEN 6 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [June],
            sum(CASE month (SOM.forderdate)
                   WHEN 7 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [July],
            sum(CASE month (SOM.forderdate)
                   WHEN 8 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Aug],
            sum(CASE month (SOM.forderdate)
                   WHEN 9 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Sept],
            sum(CASE month (SOM.forderdate)
                   WHEN 10 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Oct],
            sum(CASE month (SOM.forderdate)
                   WHEN 11 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Nov],
            sum(CASE month (SOM.forderdate)
                   WHEN 12 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Dec]
       FROM SORELS SOR
            JOIN SOMAST SOM
            ON SOM.FSONO = SOR.FSONO
            JOIN SOITEM SOI
            ON SOI.FSONO = SOR.FSONO AND SOI.FINUMBER = SOR.FINUMBER
      WHERE     FMASTERREL = 0
            AND SOM.forderdate >= CONVERT (DATETIME, '05/29/2009')
            AND SOM.forderdate < CONVERT (DATETIME, '08/04/2009')
            AND SOI.fduedate < CONVERT (DATETIME, '01/01/2010')
   GROUP BY (SOM.[fcustno] + ' - ' + SOM.[fcompany])
UNION
     SELECT 'S', -- For Ship Date
            (SOM.[fcustno] + ' - ' + SOM.[fcompany]) AS [Customer],
            sum(CASE month (SOI.fduedate)
                   WHEN 6 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [June],
            sum(CASE month (SOI.fduedate)
                   WHEN 7 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [July],
            sum(CASE month (SOI.fduedate)
                   WHEN 8 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Aug],
            sum(CASE month (SOI.fduedate)
                   WHEN 9 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Sept],
            sum(CASE month (SOI.fduedate)
                   WHEN 10 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Oct],
            sum(CASE month (SOI.fduedate)
                   WHEN 11 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Nov],
            sum(CASE month (SOI.fduedate)
                   WHEN 12 THEN (sor.forderqty * SOR.funetprice)
                   ELSE 0
                END)
               AS [Dec]
       FROM SORELS SOR
            JOIN SOMAST SOM
            ON SOM.FSONO = SOR.FSONO
            JOIN SOITEM SOI
            ON SOI.FSONO = SOR.FSONO AND SOI.FINUMBER = SOR.FINUMBER
      WHERE     FMASTERREL = 0
            AND SOM.forderdate >= CONVERT (DATETIME, '05/29/2009')
            AND SOM.forderdate < CONVERT (DATETIME, '08/04/2009')
            AND SOI.fduedate < CONVERT (DATETIME, '01/01/2010')
   GROUP BY (SOM.[fcustno] + ' - ' + SOM.[fcompany])

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

尝试添加以下内容:

ORDER BY 2,1

到脚本的末尾。看起来好像你只需要排序 - 首先是客户,然后是订单/发货

答案 1 :(得分:1)

您应该为“O”/“S”列(可能是RowType)命名。然后由客户订购,RowType。

罗布