汇总排序问题(要求系统开支小)

Layto 2009-04-16 12:41:20
我现在SQL语句如下:对某种商品,按商品类型、月份、票号汇总(goodid,convert(char(7),MAKEDATE,120),union_id )
现在我得出的结果没有按MAKEDATE排序,请问结果要按MAKEDATE asc按序显示,(wxlx 为视图)
表数据太多,只求解决办法.
select
grouping(goodid),
grouping(convert(char(7),MAKEDATE,120)),grouping(union_id),

(case when grouping(goodid)=1 then '总计' when grouping(convert(char(7),MAKEDATE,120))=1 then '合计' when grouping(union_id)=1 then '小计' else max(CT_Name) end) as dwmc,
(case when grouping(union_id)=1 then null else max(MAKEDATE) end) as MAKEDATE,
(case when grouping(union_id)=1 then null else max(CT_Code) end) as ct_code,
(case when grouping(union_id)=1 then null else max(GD_Name) end) as GD_Name,
(case when grouping(union_id)=1 then null else max(GD_Spec) end) as GD_Spec,
(case when grouping(union_id)=1 then null else max(BTHNUM) end) as BTHNUM,
(case when grouping(union_id)=1 then sum(QTY_J) else max(QTY_J) end) as QTY_J,
(case when grouping(union_id)=1 then sum(QTY_x) else max(QTY_x) end) as QTY_x,
(case when grouping(union_id)=1 then null else max(GD_Unit) end) as GD_Unit,
(case when grouping(union_id)=1 then null else max(TAXPRICE) end) as TAXPRICE,
(case when grouping(union_id)=1 then null else max(BILLTYPE) end) as BILLTYPE,
(case when grouping(union_id)=1 then null else max(GD_Manufacture) end) as GD_Manufacture,
(case when grouping(union_id)=1 then null else max(CHKNO) end) as CHKNO,
(case when grouping(union_id)=1 then null else max(GD_Code) end) as GD_Code


from wxlx
where goodID in(SELECT lg_goodid FROM Login_GID where lg_cstid='899987 ' and lg_type='00')
and MAKEDATE>='2009-2-1' and MAKEDATE<='2009-3-31 23:59:59'
group by goodid,convert(char(7),MAKEDATE,120),union_id with rollup
...全文
138 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Layto 2009-04-20
  • 打赏
  • 举报
回复
自已顶,
Layto 2009-04-16
  • 打赏
  • 举报
回复
taoistong你把with rollup丢了 ,在最后在最中加order by MAKEDATE asc整个小计,合计的排序全乱了
ws_hgo 2009-04-16
  • 打赏
  • 举报
回复

select
grouping(goodid),
grouping(convert(char(7),MAKEDATE,120)),grouping(union_id),
(case when grouping(goodid)=1 then '总计' when grouping(convert(char(7),MAKEDATE,120))=1 then '合计' when grouping(union_id)=1 then '小计' else max(CT_Name) end) as dwmc,
(case when grouping(union_id)=1 then null else max(MAKEDATE) end) as MAKEDATE,
(case when grouping(union_id)=1 then null else max(CT_Code) end) as ct_code,
(case when grouping(union_id)=1 then null else max(GD_Name) end) as GD_Name,
(case when grouping(union_id)=1 then null else max(GD_Spec) end) as GD_Spec,
(case when grouping(union_id)=1 then null else max(BTHNUM) end) as BTHNUM,
(case when grouping(union_id)=1 then sum(QTY_J) else max(QTY_J) end) as QTY_J,
(case when grouping(union_id)=1 then sum(QTY_x) else max(QTY_x) end) as QTY_x,
(case when grouping(union_id)=1 then null else max(GD_Unit) end) as GD_Unit,
(case when grouping(union_id)=1 then null else max(TAXPRICE) end) as TAXPRICE,
(case when grouping(union_id)=1 then null else max(BILLTYPE) end) as BILLTYPE,
(case when grouping(union_id)=1 then null else max(GD_Manufacture) end) as GD_Manufacture,
(case when grouping(union_id)=1 then null else max(CHKNO) end) as CHKNO,
(case when grouping(union_id)=1 then null else max(GD_Code) end) as GD_Code
from wxlx
where goodID in(SELECT lg_goodid FROM Login_GID where lg_cstid='899987 ' and lg_type='0')
and MAKEDATE>='2009-2-1' and MAKEDATE <='2009-3-31 23:59:59'
group by goodid,convert(char(7),MAKEDATE,120),union_id with rollup order by MAKEDATE asc
taoistong 2009-04-16
  • 打赏
  • 举报
回复
这个可以创建视图
taoistong 2009-04-16
  • 打赏
  • 举报
回复


select top 1000000
grouping(goodid),
grouping(convert(char(7),MAKEDATE,120)),grouping(union_id),

(case when grouping(goodid)=1 then '总计' when grouping(convert(char(7),MAKEDATE,120))=1 then '合计' when grouping(union_id)=1 then '小计' else max(CT_Name) end) as dwmc,
(case when grouping(union_id)=1 then null else max(MAKEDATE) end) as MAKEDATE,
(case when grouping(union_id)=1 then null else max(CT_Code) end) as ct_code,
(case when grouping(union_id)=1 then null else max(GD_Name) end) as GD_Name,
(case when grouping(union_id)=1 then null else max(GD_Spec) end) as GD_Spec,
(case when grouping(union_id)=1 then null else max(BTHNUM) end) as BTHNUM,
(case when grouping(union_id)=1 then sum(QTY_J) else max(QTY_J) end) as QTY_J,
(case when grouping(union_id)=1 then sum(QTY_x) else max(QTY_x) end) as QTY_x,
(case when grouping(union_id)=1 then null else max(GD_Unit) end) as GD_Unit,
(case when grouping(union_id)=1 then null else max(TAXPRICE) end) as TAXPRICE,
(case when grouping(union_id)=1 then null else max(BILLTYPE) end) as BILLTYPE,
(case when grouping(union_id)=1 then null else max(GD_Manufacture) end) as GD_Manufacture,
(case when grouping(union_id)=1 then null else max(CHKNO) end) as CHKNO,
(case when grouping(union_id)=1 then null else max(GD_Code) end) as GD_Code


from wxlx
where goodID in(SELECT lg_goodid FROM Login_GID where lg_cstid='899987 ' and lg_type='00')
and MAKEDATE>='2009-2-1' and MAKEDATE <='2009-3-31 23:59:59'
group by goodid,convert(char(7),MAKEDATE,120),union_id
order by MAKEDATE asc
ws_hgo 2009-04-16
  • 打赏
  • 举报
回复
看下
htl258_Tony 2009-04-16
  • 打赏
  • 举报
回复
代码看来看有点累,后面加order by 排序后有什么问题?
  • 打赏
  • 举报
回复
from wxlx 
where goodID in(SELECT lg_goodid FROM Login_GID where lg_cstid='899987 ' and lg_type='00')

改为

from wxlx join lg_goodid on wxlx.gooid=lg_goodid .goodid and lg_cstid='899987 ' and lg_type='00'

另外给你个列子,觉得你的case写的比较繁琐。

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
/*--结果
Groups Item Color Quantity
-------- ---------------- ---------------------- -----------
aa Chair Blue 101
aa Chair Red -90
Chair 小计 11
aa Table Blue 124
Table 小计 124
aa 合计 135
bb Cup Green -23
Cup 小计 -23
bb Table Red -23
Table 小计 -23
bb 合计 -46
总计 89
--*/
Layto 2009-04-16
  • 打赏
  • 举报
回复
道士佟这办法可行,top 10000假若20000,那我top 20000了,有没有更好的办法吗
play7788 2009-04-16
  • 打赏
  • 举报
回复
嗯。
taoistong 2009-04-16
  • 打赏
  • 举报
回复



create view v_taoistong as

select top 10000 * from
(select
grouping(goodid),
grouping(convert(char(7),MAKEDATE,120)) make_date,grouping(union_id),

(case when grouping(goodid)=1 then '总计' when grouping(convert(char(7),MAKEDATE,120))=1 then '合计' when grouping(union_id)=1 then '小计' else max(CT_Name) end) as dwmc,
(case when grouping(union_id)=1 then null else max(MAKEDATE) end) as MAKEDATE,
(case when grouping(union_id)=1 then null else max(CT_Code) end) as ct_code,
(case when grouping(union_id)=1 then null else max(GD_Name) end) as GD_Name,
(case when grouping(union_id)=1 then null else max(GD_Spec) end) as GD_Spec,
(case when grouping(union_id)=1 then null else max(BTHNUM) end) as BTHNUM,
(case when grouping(union_id)=1 then sum(QTY_J) else max(QTY_J) end) as QTY_J,
(case when grouping(union_id)=1 then sum(QTY_x) else max(QTY_x) end) as QTY_x,
(case when grouping(union_id)=1 then null else max(GD_Unit) end) as GD_Unit,
(case when grouping(union_id)=1 then null else max(TAXPRICE) end) as TAXPRICE,
(case when grouping(union_id)=1 then null else max(BILLTYPE) end) as BILLTYPE,
(case when grouping(union_id)=1 then null else max(GD_Manufacture) end) as GD_Manufacture,
(case when grouping(union_id)=1 then null else max(CHKNO) end) as CHKNO,
(case when grouping(union_id)=1 then null else max(GD_Code) end) as GD_Code
from wxlx
where goodID in(SELECT lg_goodid FROM Login_GID where lg_cstid='899987 ' and lg_type='00')
and MAKEDATE>='2009-2-1' and MAKEDATE <='2009-3-31 23:59:59'
group by goodid,convert(char(7),MAKEDATE,120),union_id with rollup
) a order by make_date asc


这下可以了,结贴吧
zxb9118b 2009-04-16
  • 打赏
  • 举报
回复
楼上的解法是对的,得汇总,不然肯定乱的
sdhdy 2009-04-16
  • 打赏
  • 举报
回复
楼主,你得把小计、合计和group by 那些列表项结合起来才可以的,要不怎么排序。
给你个例子。
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(Groups)=1 THEN '总计'
WHEN GROUPING(ITEM)=1 AND GROUPING(color)=1 THEN Groups+'合计'
ELSE Groups END,
Item=CASE
WHEN GROUPING(color)=1 AND GROUPING(Item)=0 THEN item+' 合计'
WHEN GROUPING(color)=1 AND GROUPING(Item)=1 THEN ''
ELSE Item END,
Color=CASE
WHEN GROUPING(Color)=0 THEN Color
ELSE '' END,
Quantity=SUM(Quantity)
FROM @t
GROUP BY Groups,Item,Color WITH ROLLUP
/*
Groups Item Color Quantity
------ --------------- ---------- -----------
aa Chair Blue 101
aa Chair Red -90
aa Chair 合计 11
aa Table Blue 124
aa Table 合计 124
aa合计 135
bb Cup Green -23
bb Cup 合计 -23
bb Table Red -23
bb Table 合计 -23
bb合计 -46
总计 89

(所影响的行数为 12 行)
*/
claro 2009-04-16
  • 打赏
  • 举报
回复
帮顶。
Layto 2009-04-16
  • 打赏
  • 举报
回复
简化一下条件
select
grouping(goodid),
grouping(convert(char(7),MAKEDATE,120)),grouping(union_id),

(case when grouping(goodid)=1 then '总计' when grouping(convert(char(7),MAKEDATE,120))=1 then '合计' when grouping(union_id)=1 then '小计' else max(CT_Name) end) as dwmc,
(case when grouping(union_id)=1 then null else max(MAKEDATE) end) as MAKEDATE,
(case when grouping(union_id)=1 then null else max(CT_Code) end) as ct_code,
(case when grouping(union_id)=1 then null else max(GD_Name) end) as GD_Name,
(case when grouping(union_id)=1 then null else max(GD_Spec) end) as GD_Spec,
(case when grouping(union_id)=1 then null else max(BTHNUM) end) as BTHNUM,
(case when grouping(union_id)=1 then sum(QTY_J) else max(QTY_J) end) as QTY_J,
(case when grouping(union_id)=1 then sum(QTY_x) else max(QTY_x) end) as QTY_x,
(case when grouping(union_id)=1 then null else max(GD_Unit) end) as GD_Unit,
(case when grouping(union_id)=1 then null else max(TAXPRICE) end) as TAXPRICE,
(case when grouping(union_id)=1 then null else max(BILLTYPE) end) as BILLTYPE,
(case when grouping(union_id)=1 then null else max(GD_Manufacture) end) as GD_Manufacture,
(case when grouping(union_id)=1 then null else max(CHKNO) end) as CHKNO,
(case when grouping(union_id)=1 then null else max(GD_Code) end) as GD_Code

from wxlx group by goodid,convert(char(7),MAKEDATE,120),union_id with rollup
Layto 2009-04-16
  • 打赏
  • 举报
回复
请大家不要考虑显示字段,关键在小计、合计后,排序问题
新源广告公司业务管理系统(以下简称“该系统”)是一款完善、实用,专门针对广告行业的管理系统,主要功能包括日常进销存管理 、往来账务管理以及客户业务管理,同时还包括合同管理、外协管理、拜访客户、员工提成、员工奖惩、来电提醒录音。 该系统具有不错的可定制、可伸缩性,用户可以根据自己的企业需要做相关设置以满足自己的个性需求。系统以SQL Server 2000为后台数据库;对于业务数据量大、稳定性要求高、操作终端多的用户尤其适合。 该系统支持对业务资料的模糊查询、组合查询、汉字首拼音字母查询;支持多级权限管理;支持条码管理;支持打印报表的自定义修改;数据自动备份功能;支持在线免费升级。 适用用户: 各类广告公司制作企业,如:喷绘公司、写真公司、雕刻公司等或综合型加工制作企业。 系统特点: 支持合同管理,在业务开单时可以直接引用业务合同;支持业务图文上传下载管理;提成方式灵活,功能不错,可以不同员工角色、不同业务类型,以及比较特殊的如按材料成本、技术等级等因素来单独设置提成;支持产品条码管理,条码定义、打印、产品条码扫描开单;支持临时客户和正式客户分开管理,这样可以对一些重要客户进行跟踪管理,同时客户资料库也不会过于繁乱。 功能要点: 基础数据:计量单位、颜色列表、品牌列表、材料列表、入库类型、出库类型、区域列表、发票类别、来电类别、事务类别、业务类别、单据来源、安装要求、外协类别、拜访形式、拜访结果、提成角色、收提货要求、业务优先级、部门目录、技术等级、员工目录、仓库目录、产品分类、产品目录、厂商/外协分类、厂商/外协目录、客户分类、客户目录、合同分类、合同目录、结算项目、结算账户、结算方式; 业务管理:业务开单、业务确认、设计样图、加工制作、后期制作、送货安装、业务结算、业务审核、业务查询;外协开单、外协查询; 采购管理:采购订单、采购订单查询、采购开单、采购查询; 仓库管理:总库存、分仓库存、出入库开单、出入库查询、调拨开单、调拨查询、盘点开单、盘点查询、成本调价开单、成本调价查询; 账款管理:收款开单、付款开单、收付款查询、其它收入、费用开支、收入费用查询、账户转账开单、账户转账查询、账户余额查询、补充应收应付开单、补充应收应付查询、应收应付对冲开单、应收应付对冲查询、未结应收应付查询; 办公管理:来电管理、事务跟踪、手机短信、拜访客户、知识库管理、共享文档、内部公告、消息设置、内部消息、记事本、员工工资汇总、员工提成奖惩; 统计报表:经营历程报表、客户业务报表、外协业务报表、采购业务报表、仓库业务报表、账款业务报表。 技术特点: (1)三层技术结构,网络数据传输更有效更稳定,便于远程进行访问管理; (2)多账套管理,便于账套安全维护和提高系统性能; (3)多窗口界面,操作更简便快捷,体验性更好; (4)自定义布局,可设置界面字段的显示和排序; (5)自定义打印报表,自己定义所需要的单据打印效果。 (6)数据库稳定,数据的安全是所有客户都比较关心的问题,本系统采用的是MS SQL Server数据库,其是目前管理系统采用的主流数据库系统,数据运行速度快,运算处理,安全稳定。

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧