我在使用group by with rollup查询一数据库时,发觉在某一时间段的结果集顺序发生了错误,这个使用with rollup语句是作为导出表与另一个表进行链接查询的,若单独使用作为导出表的语句是没有问题的,其错误的结果是那些合计行排在结果集的最前面,但是比较奇怪,有些时间段的结果集是没有问题的.
我怀疑是与另一表的链接时导致了作为导出表的结果集顺序发生了变化,请问怎样使结果集按导出表的顺序!!
我怀疑是与另一表的链接时导致了作为导出表的结果集顺序发生了变化,请问怎样使结果集按导出表的顺序!!
解决方案 »
- 今天把服务器换到WINDOWS2008上出现的问题,来看看
- 这个问题把我搞定了,大家谁能搞定它呀——怎样用一个表中的字段更新另一个表中的字段呀?
- 数据库的的表怎么打不开?
- 将excel里的数据表结构生成脚本,插入到SQL数据库中生成数据表
- mssql2008对长字段内容如何快速排序。
- 去除周末算间隔天数的问题。
- 遇到一个很急的触发器问题,求高人指点
- 求一统计SQL . 急.................................
- 在sql server7.0里面怎么象2000一样attach .mdf文件??
- 如何通过一对多关系的多关系表的几个值来唯一确定一关系的值
- sql如何查询一条新闻的相关新闻
- sql中同一条sql语句 只是查询条件中的时间不同但是执行速度差别很大(就是在一个时间段内慢,大于这个时间段就没问题)
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
--*/
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年以前的数据才有问题,真是奇怪!