我在使用group by with rollup查询一数据库时,发觉在某一时间段的结果集顺序发生了错误,这个使用with rollup语句是作为导出表与另一个表进行链接查询的,若单独使用作为导出表的语句是没有问题的,其错误的结果是那些合计行排在结果集的最前面,但是比较奇怪,有些时间段的结果集是没有问题的.
我怀疑是与另一表的链接时导致了作为导出表的结果集顺序发生了变化,请问怎样使结果集按导出表的顺序!!

解决方案 »

  1.   

    DECLARE @t TABLE(Groups char(2),Item varchar(10),Color varchar(10),Quantity int)
    INSERT @t SELECT 'aa','Table','Blue', 124
    UNION ALL SELECT 'bb','Table','Red',  -23
    UNION ALL SELECT 'bb','Cup'  ,'Green',-23
    UNION ALL SELECT 'aa','Chair','Blue', 101
    UNION ALL SELECT 'aa','Chair','Red',  -90--统计及排序
    SELECT Groups=CASE 
    WHEN GROUPING(Color)=0 THEN Groups
    WHEN GROUPING(Groups)=1 THEN '总计'
    ELSE '' END,
    Item=CASE 
    WHEN GROUPING(Color)=0 THEN Item
    WHEN GROUPING(Item)=1 AND GROUPING(Groups)=0 THEN Groups+' 合计'
    ELSE '' END,
    Color=CASE 
    WHEN GROUPING(Color)=0 THEN Color
    WHEN GROUPING(Color)=1 AND GROUPING(Item)=0 THEN Item+' 小计'
    ELSE '' END,
    Quantity=SUM(Quantity)
    FROM @t
    GROUP BY Groups,Item,Color WITH ROLLUP
    ORDER BY GROUPING(Groups),
    CASE WHEN GROUPING(Groups)=1 THEN '' ELSE Groups END DESC,
    GROUPING(Item),
    CASE WHEN GROUPING(Item)=1 THEN '' ELSE Item END DESC,
    GROUPING(Color),
    CASE WHEN GROUPING(Color)=1 THEN '' ELSE Color END DESC,
    Quantity DESC
    /*--结果
    Groups Item       Color           Quantity    
    --------- -------------- ----------------------- ----------- 
    bb     Table      Red             -23
                     Table 小计       -23
    bb     Cup       Green           -23
                     Cup 小计        -23
           bb 合计                    -46
    aa     Table      Blue            124
                     Table 小计       124
    aa     Chair      Red             -90
    aa     Chair      Blue            101
                     Chair 小计       11
           aa 合计                    135
    总计                              89
    --*/
      

  2.   

    我的语句:
    SELECT fCNum, A.fCNumName, A.fItem_Num, 
    C.fName AS fItemName, C.fSp, C.fUnit, A.fQty, A.fPrice, fAmnt 
    FROM

    SELECT  fCNum = CASE 
    WHEN GROUPING(A.fCID) = 1  THEN '总计'
    WHEN GROUPING(B.fItem_Num) = 1  THEN '合计'
    WHEN GROUPING(B.fPrice) = 1  THEN '小计' 
    ELSE A.fCID end,
    fCNumName = 
    CASE 
      WHEN GROUPING(B.fItem_Num) = 1  THEN ''
    WHEN GROUPING(B.fPrice) = 1  THEN ''
    ELSE MIN(D.fName) 
    END, 
    fItem_Num = 
    CASE 
    WHEN GROUPING(B.fPrice) = 1 THEN '' 
    ELSE B.fItem_Num 
    END, 
    SUM(CASE WHEN C.fType = '0' THEN B.fbQty ELSE B.fQty END) AS fQty, 
    fPrice = CASE WHEN (GROUPING(B.fItem_Num) = 1) THEN null  ELSE B.fPrice END, 
    SUM(CASE WHEN C.fType = '0' THEN B.fPrice * B.fbQty ELSE B.fPrice * B.fQty END) AS fAmnt
    FROM  t_StockOut_Mas      A 
    INNER JOIN t_StockOut_Dtl B  ON A.fNum  = B.fNum 
    INNER JOIN vw_AllItems    C  ON B.fItem_Num  = C.fNum 
    LEFT OUTER JOIN t_Customers D ON A.fCID = D.fNum 
    WHERE A.fType = 1   AND A.fDate BETWEEN '2006-01-01' AND '2006-01-28'
      GROUP BY A.fCID, B.fItem_Num, B.fPrice WITH ROLLUP
    )A 
    LEFT OUTER JOIN vw_AllItems C ON A.fItem_Num = C.fNum数据量有多大,不方便给出,不过错误的结果集这样的:
    fCustomerID  fcustomer  fItem_Num fItemName         fSp  fUnit    fQty    fPrice  fAmnt                                    
    小计     NULL           NULL     NULL                            1.0      NULL    30.000000
    合计     NULL           NULL       NULL                          1.00     NULL    30.000000
    小计     NULL   NULL    NULL     1.00                            1.0      NULL    130.000000
    合计     NULL           NULL                            NULL     1.00     NULL    130.000000
    总计     NULL           NULL                                     59233.26 NULL    672446.630000
    0330     鼎盛公司       001       小氧气                 瓶       2.00     15.0000 30.000000
    0655     吉得利         002       小氩气                 瓶       1.00     25.0000 25.000000
    0572     合山源兴农机站 002        小氩气                 瓶       2.00     15.0000 30.000000
    0207     同志          002        小氩气                 瓶       13.00     25.0000 325.000000这是正常的:
    fcustomerID    fcustomer     fItem_Num fItemName            fSp     fUnit    fQty   fPrice    fAmnt                   
    -------- -------------------------------------------------- --------- -------------------- ------------------------------ -------- ---------------------------------------- -------------- ---------------------------------------- 
    0207     同志           002       小氩气                       瓶        1.00  25.0000   25.000000
    小计                    NULL      NULL                         NULL     1.00   NULL      25.000000
    合计                    NULL      NULL                         NULL     1.00   NULL      25.000000
    0580     阳春分公司     01        氧气(O2)              40L     瓶       15.00 15.0000    225.000000
    小计     NULL       NULL          NULL                                  15.00  NULL      225.000000
    合计     NULL       NULL          NULL      15.00  NULL      225.000000
    总计     NULL       NULL         NULL      16.00  NULL      250.000000(所影响的行数为 7 行)
    正常的结果集是日期区间是从'2006-01-27' 到 '2006-01-28',错误的是'2006-01-01' 到 '2006-01-28',也就是说,不同的日期产生了不同的排更顺序,这个数据库原来一直没有问题的,而是只是2007年以前的数据才有问题,真是奇怪!