Sql分组合计小计查询

效果如下:

用的表和字段:

-table 实收水费:hx_t_received 

--字段收费部门idhx_fdepartmentid  1、收费部门名称:hx_fdepartmentname 应收水费信息ID:hx_freceivableid

--收费类别:hx_ftype (水费(1):再分[开户(table) 供水类别:自来水(100000001)==水费,中水(100000002)==中水费],代理费(2)==污水处理费)

--实收金额:hx_freceivedamount  创建时间:createdon 支付方式:hx_fpayway(现金:100,000,000与支票:100,000,001,充值账户:,000,002)

--交易状态:hx_fstate(:【作废:,000,002、银行付款:,000,003】,入账:,000,000)

 

--table 应收水费:hx_t_receivable

--字段 水量信息ID:hx_fusedamountid 主键:hx_t_ReceivableId

--:hx_fcollchargesreceivable4(污水处理费),hx_freceivablefee(应收水费),hx_fusedamountid(水量信息)

--hx_fstate(水量状态计划:100000000),

--hx_frecordtype(抄表类型):正常,000,000  估水,000,001 未抄见,000,002

--hx_festimateamountreason(估水原因):不用水,000,000 无表,000,001 防冻,000,002 表停,000,003

--hx_fnotrecordreason(未抄见原因):未见表,000,000 有水,000,001 表埋,000,002 锁门,000,003 表不清,000,004

--hx_freading(本次抄表止度)

 

--table 用水水量:hx_t_waterusedamount

--字段 开户信息:hx_fcustomerandmeterrelaid 主键:hx_t_WaterUsedAmountId 负责团队:owningteam

hx_frecorder(抄表员),hx_fzone(区段),hx_fmeterid(水表),hx_fpayamount(结算水量),hx_fdepartmentid(收费部门)

 

--table  开户信息:hx_t_customerandmeterrela

--字段供水类别:hx_fwatertype  负责人:ownerid 主键:hx_t_CustomerAndMeterRelaId

 

--table  团队:team

--字段 主键:teamid  业务部门:businessunitid

 

--table  部门:businessunit

--字段 主键:businessunitid  上级部门:parentbusinessunitid 名称:Name

SQL代码:

declare @begin_date datetime
declare @end_date datetime
select @begin_date = getdate()

declare @hx_ClosingAccountInfoId uniqueidentifier
set @hx_ClosingAccountInfoId='08AFEF9F-E174-46F2-855A-32F26BE38F3B'

-----------------SQL正文----------------------------------------------------------执行时间:
declare @FMonth int
declare @FYear int
select @FYear=t.hx_FYear,@FMonth=t.hx_FMonth from hx_ClosingAccountInfo t where 
hx_ClosingAccountInfoId=@hx_ClosingAccountInfoId

 SELECT
	CASE
		WHEN (GROUPING(u.ParentBusinessUnitIdName) = 1) THEN '总计'
		ELSE ISNULL(u.ParentBusinessUnitIdName, '未知')
	END AS zfsName,--征收所名称
	CASE
		WHEN (GROUPING(t.Name) = 1 AND
			GROUPING(u.ParentBusinessUnitIdName) = 1) THEN ' '
		WHEN GROUPING(t.Name) = 1 THEN '小计'
		ELSE ISNULL(t.Name, '未知')
	END AS ItemName ,--抄表班组名称
	
sum(1) as AllCounts,
sum(case when w.hx_frecordtype='100000000' then 1 else 0 end) Normal,
sum(case when w.hx_frecordtype='100000001' and w.hx_festimateamountreason='100000000' then 1 else 0 end) NotUseWater,
sum(case when w.hx_frecordtype='100000001' and w.hx_festimateamountreason='100000001' then 1 else 0 end) NoMeterWater,
sum(case when w.hx_frecordtype='100000001' and w.hx_festimateamountreason='100000002' then 1 else 0 end) antifreeze,
sum(case when w.hx_frecordtype='100000001' and w.hx_festimateamountreason='100000003' then 1 else 0 end) MeterStop,
sum(case when w.hx_frecordtype='100000001' and w.hx_festimateamountreason not in('100000000','100000001','100000002','100000003') 
then 1 else 0 end) OtherWater,

sum(case when w.hx_frecordtype='100000002' and w.hx_fnotrecordreason='100000000' then 1 else 0 end) NotSeeMeterWater,
sum(case when w.hx_frecordtype='100000002' and w.hx_fnotrecordreason='100000001' then 1 else 0 end) HaveWater,
sum(case when w.hx_frecordtype='100000002' and w.hx_fnotrecordreason='100000002' then 1 else 0 end) MeterWaterBuried,
sum(case when w.hx_frecordtype='100000002' and w.hx_fnotrecordreason='100000003' then 1 else 0 end) LockDoor,
sum(case when w.hx_frecordtype='100000002' and w.hx_fnotrecordreason='100000004' then 1 else 0 end) MeterWaterFuzzy,

sum(case when w.hx_freading is null then 1 else 0 end) hx_freading
	
from hx_t_waterusedamount w--水量
INNER JOIN hx_t_receivable r --应收
	ON w.hx_t_waterusedamountid=r.hx_fusedamountid and w.hx_FYear=@FYear and w.hx_FMonth=@FMonth
--团队
INNER JOIN Team t
	ON w.OwningTeam = t.TeamId
--部门
INNER JOIN BusinessUnit u
	ON t.BusinessUnitId = u.BusinessUnitId
	
GROUP BY	u.ParentBusinessUnitIdName,
			t.Name WITH ROLLUP
---------------------------------------------------------------------------

select @end_date = getdate()
select datediff(ms,@begin_date,@end_date) as '用时/毫秒'
SQL执行效果如下:


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。