BudSubInfo(预算科目表)
字段名称 字段类型 允许空 默认值 字段说明 备注
SubID int N 预算科目ID PK
SubName varchar(50)  N 科目名称
SubState int Y 0 科目状态 0=正常,1=冻结
DepID int N 科目所属部门 如果为公共(每部门都有)科目,则Depid=0
SubType int N 科目所属类型 大类,1=收入汇总 2=部门日常费用汇总 3=专项
createtime datetime
--------------------------------------------------------------------------------------------------
BudInfo(预算信息表)
字段名称 字段类型 允许空 默认值 字段说明 备注
BID int N 预算ID PK
Bmonth int N 月份 数字
Year int N 年份 例如2012等
MonthExplain varchar(max) Y 当月业务预算说明 会填的内容会很多
MBudNumber int Y 当月预算数
InBudNumber int Y 预算内数据
OutBudNumber int y 预算外数据
DiffAn varchar(max) Y 差异分析 会填的内容会很多
DepID int y 部门ID
BudSubID int y 预算科目编号
YearExplain varchar(max) y 年度预算说明 会填的内容会很多
YearBudNumber int y 年度预算数
Creator int y 创建人 填写预算人
Createtime datetime y getdate 创建日期
----------------------------------------------------------------------------------------------------
DepInfo(部门表)
字段名称 字段类型 允许空 默认值 字段说明 备注
DepID int N 部门编号 PK
DepName varchar(50) N 部门名称
parentID int N 0 上级部门ID 0=顶层菜单,
DepState int Y 0 部门状态  是否可用,0=可用 1=不可用
DepContent text y 部门描述 描述备注
IsValid int Y 0 是否参与总表计算 0=参与 1=不参与
------------------------------------------------------------------------------------------------------
--插入测试数据
insert into depinfo values('营销中心',0,0,'',0)
insert into depinfo values('技术支持部',0,0,'',0)
--插入部门预算项目(收入汇总类别)
insert into budsubinfo values('营销收入类预算科目1',0,1,1,getdate())
insert into budsubinfo values('营销收入类预算科目2',0,1,1,getdate())
insert into budsubinfo values('技术支持部收入类预算科目1',0,2,1,getdate())
insert into budsubinfo values('技术支持部收入类预算科目2',0,2,1,getdate())
--插入公共预算科目(即每个部门都有的)(为部门日常费用汇总类别)
insert into budsubinfo values('工资(含餐费)',0,0,2,getdate())
insert into budsubinfo values('保险',0,0,2,getdate())
--插入专项类别部门预算科目
insert into budsubinfo values('杂志广告',0,1,3,getdate())
insert into budsubinfo values('网络宣传广告',0,1,3,getdate())
insert into budsubinfo values('书籍资料',0,2,3,getdate())
insert into budsubinfo values('外包费用',0,2,3,getdate())
--插入测试预算信息
insert into budinfo values(3,2012,null,1,1,1,null,1,1,null,1,1,getdate())
insert into budinfo values(3,2012,null,2,2,2,null,1,2,null,2,1,getdate())
insert into budinfo values(3,2012,null,3,3,3,null,2,3,null,3,1,getdate())
insert into budinfo values(3,2012,null,4,4,4,null,2,4,null,4,1,getdate())
...
------------------------------------------------------------------------------------------------------
要求是获取每个部门一年中每个月的每个预算项目的相关预算数据列表,并汇总,
--下面这个sql是我写的用来显示各部门各个预算项每月各项的相关预算值,我把下面这sql作为一个视图,视图名称为v_budinfo,然后再对这个视图进行操作查询
SELECT     b.BID, b.BudSubID, b.DepID,d.depname, s.SubType, s.SubName, MAX(CASE bmonth WHEN 3 THEN monthexplain ELSE '' END) AS MarBudExplain, 
                      MAX(CASE bmonth WHEN 3 THEN mbudnumber ELSE 0 END) AS MarBudSubNumber, MAX(CASE bmonth WHEN 3 THEN InBudNumber ELSE 0 END) AS MarInNumber, 
                      MAX(CASE bmonth WHEN 3 THEN OutBudNumber ELSE 0 END) AS MarOutNumber, MAX(CASE bmonth WHEN 3 THEN DiffAn ELSE '' END) AS MarDiffAN, 
                      MAX(CASE bmonth WHEN 4 THEN monthexplain ELSE '' END) AS AprBudExplain, MAX(CASE bmonth WHEN 4 THEN mbudnumber ELSE 0 END) AS AprBudSubNumber, 
                      MAX(CASE bmonth WHEN 4 THEN InBudNumber ELSE 0 END) AS AprInNumber, MAX(CASE bmonth WHEN 4 THEN OutBudNumber ELSE 0 END) AS AprOutNumber, 
                      MAX(CASE bmonth WHEN 4 THEN DiffAn ELSE '' END) AS AprDiffAn, MAX(CASE bmonth WHEN 5 THEN monthexplain ELSE '' END) AS MayBudExplain, 
                      MAX(CASE bmonth WHEN 5 THEN mbudnumber ELSE 0 END) AS MayBudSubNumber, MAX(CASE bmonth WHEN 5 THEN InBudNumber ELSE 0 END) AS MayInNumber,
                       MAX(CASE bmonth WHEN 5 THEN OutBudNumber ELSE 0 END) AS MayOutNumber, MAX(CASE bmonth WHEN 5 THEN DiffAn ELSE '' END) AS MayDiffAn, 
                      MAX(CASE bmonth WHEN 6 THEN monthexplain ELSE '' END) AS JunBudExplain, MAX(CASE bmonth WHEN 6 THEN mbudnumber ELSE 0 END) AS JunBudSubNumber,
                       MAX(CASE bmonth WHEN 6 THEN InBudNumber ELSE 0 END) AS JunInNumber, MAX(CASE bmonth WHEN 6 THEN OutBudNumber ELSE 0 END) AS JunOutNumber, 
                      MAX(CASE bmonth WHEN 6 THEN DiffAn ELSE '' END) AS JunDiffAN, MAX(CASE bmonth WHEN 7 THEN monthexplain ELSE '' END) AS JulBudExplain, 
                      MAX(CASE bmonth WHEN 7 THEN mbudnumber ELSE 0 END) AS JulBudSubNumber, MAX(CASE bmonth WHEN 7 THEN InBudNumber ELSE 0 END) AS JulInNumber, 
                      MAX(CASE bmonth WHEN 7 THEN OutBudNumber ELSE 0 END) AS JulOutNumber, MAX(CASE bmonth WHEN 7 THEN DiffAn ELSE '' END) AS JulDiffAn, 
                      MAX(CASE bmonth WHEN 8 THEN monthexplain ELSE '' END) AS AugBudExplain, MAX(CASE bmonth WHEN 8 THEN mbudnumber ELSE 0 END) 
                      AS AugBudSubNumber, MAX(CASE bmonth WHEN 8 THEN InBudNumber ELSE 0 END) AS AugInNumber, MAX(CASE bmonth WHEN 8 THEN OutBudNumber ELSE 0 END)
                       AS AugOutNumber, MAX(CASE bmonth WHEN 8 THEN DiffAn ELSE '' END) AS AugDiffAn, MAX(CASE bmonth WHEN 9 THEN monthexplain ELSE '' END) 
                      AS SepBudExplain, MAX(CASE bmonth WHEN 9 THEN mbudnumber ELSE 0 END) AS SepBudSubNumber, MAX(CASE bmonth WHEN 9 THEN InBudNumber ELSE 0 END)
                       AS SepInNumber, MAX(CASE bmonth WHEN 9 THEN OutBudNumber ELSE 0 END) AS SepOutNumber, MAX(CASE bmonth WHEN 9 THEN DiffAn ELSE '' END) 
                      AS SepDiffAn, MAX(CASE bmonth WHEN 10 THEN monthexplain ELSE '' END) AS OctBudExplain, MAX(CASE bmonth WHEN 10 THEN mbudnumber ELSE 0 END) 
                      AS OctBudNumber, MAX(CASE bmonth WHEN 10 THEN InBudNumber ELSE 0 END) AS OctInNumber, MAX(CASE bmonth WHEN 10 THEN OutBudNumber ELSE 0 END) 
                      AS OctOutNumber, MAX(CASE bmonth WHEN 10 THEN DiffAn ELSE '' END) AS OctDiffAn, MAX(CASE bmonth WHEN 11 THEN monthexplain ELSE '' END) 
                      AS NovBudExplain, MAX(CASE bmonth WHEN 11 THEN mbudnumber ELSE 0 END) AS NovBudSubNumber, 
                      MAX(CASE bmonth WHEN 11 THEN InBudNumber ELSE 0 END) AS NovInNumber, MAX(CASE bmonth WHEN 11 THEN OutBudNumber ELSE 0 END) AS NovOutNumber, 
                      MAX(CASE bmonth WHEN 11 THEN DiffAn ELSE '' END) AS NovDiffAn, MAX(CASE bmonth WHEN 12 THEN monthexplain ELSE '' END) AS DecBudExplain, 
                      MAX(CASE bmonth WHEN 12 THEN mbudnumber ELSE 0 END) AS DecBudSubNumber, MAX(CASE bmonth WHEN 12 THEN InBudNumber ELSE 0 END) 
                      AS DecInNumber, MAX(CASE bmonth WHEN 12 THEN OutBudNumber ELSE 0 END) AS DecOutNumber, MAX(CASE bmonth WHEN 12 THEN DiffAn ELSE '' END) 
                      AS DecDiffAn, MAX(CASE bmonth WHEN 1 THEN monthexplain ELSE '' END) AS JanBudExplain, MAX(CASE bmonth WHEN 1 THEN mbudnumber ELSE 0 END) 
                      AS JanBudSubNumber, MAX(CASE bmonth WHEN 1 THEN InBudNumber ELSE 0 END) AS JanInNumber, MAX(CASE bmonth WHEN 1 THEN OutBudNumber ELSE 0 END)
                       AS JanOutNumber, MAX(CASE bmonth WHEN 1 THEN DiffAn ELSE '' END) AS JanDiffAn, MAX(CASE bmonth WHEN 2 THEN monthexplain ELSE '' END) 
                      AS FebBudExplain, MAX(CASE bmonth WHEN 2 THEN mbudnumber ELSE 0 END) AS FebBudSubNumber, MAX(CASE bmonth WHEN 2 THEN InBudNumber ELSE 0 END)
                       AS FebInNumber, MAX(CASE bmonth WHEN 2 THEN OutBudNumber ELSE 0 END) AS FebOutNumber, MAX(CASE bmonth WHEN 2 THEN DiffAn ELSE '' END) 
                      AS FebDiffAn, SUM(b.InBudNumber) + SUM(b.OutBudNumber) AS YNDSJDY, MAX(CASE bmonth WHEN 3 THEN YearExplain ELSE '' END) AS YBudExplain, 
                      MAX(CASE bmonth WHEN 3 THEN YearBudNumber ELSE 0 END) AS YBudNumber, CAST(CAST(100.0 * (SUM(b.InBudNumber) + SUM(b.OutBudNumber)) 
                      / MAX(CASE bmonth WHEN 3 THEN YearBudNumber ELSE 1 END) AS decimal(18, 2)) AS varchar(12)) + '%' AS YPayPro
FROM         dbo.BudInfo AS b INNER JOIN
                      dbo.BudSubInfo AS s ON b.BudSubID = s.SubID inner join depinfo d on b.depid=d.depid
GROUP BY s.SubType,b.DepID,d.depname,b.BudSubID,s.SubName, b.BID
--最终要获得的结果如下:
主要是所有部门那块不知道该如何弄,所有部门那一栏放的是部门日常费用汇总 见上图,
其他的通过union all 我可以是实现各个类别的汇总功能,
sql不是强项,求助

解决方案 »

  1.   


    这次应该能显示了把,图片地址
    http://www.ordersface.com/Images/1111.png
      

  2.   

    疏忽了,这是创建表GO
    /****** 对象:  Table [dbo].[DepInfo]    脚本日期: 03/29/2012 16:04:51 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[DepInfo](
    [DepID] [int] IDENTITY(1,1) NOT NULL,
    [DepName] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [ParentID] [int] NOT NULL CONSTRAINT [DF_DepInfo_ParentID]  DEFAULT ((0)),
    [DepState] [int] NOT NULL CONSTRAINT [DF_DepInfo_DepState]  DEFAULT ((0)),
    [DepContent] [text] COLLATE Chinese_PRC_CI_AS NULL,
    [IsValid] [int] NULL CONSTRAINT [DF_DepInfo_Isabs]  DEFAULT ((0)),
     CONSTRAINT [PK_DepInfo] PRIMARY KEY CLUSTERED 
    (
    [DepID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GO
    SET ANSI_PADDING OFFCREATE TABLE [dbo].[BudSubInfo](
    [SubID] [int] IDENTITY(1,1) NOT NULL,
    [SubName] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [SubState] [int] NULL CONSTRAINT [DF_BudSubInfo_SubState]  DEFAULT ((0)),
    [DepID] [int] NULL,
    [SubType] [int] NULL,
    [createtime] [datetime] NULL
    ) ON [PRIMARY]
    CREATE TABLE [dbo].[BudInfo](
    [BID] [int] IDENTITY(1,1) NOT NULL,
    [Bmonth] [int] NOT NULL,
    [Year] [int] NOT NULL,
    [MonthExplain] [varchar](max) COLLATE Chinese_PRC_CI_AS NULL,
    [MBudNumber] [int] NULL,
    [InBudNumber] [int] NULL,
    [OutBudNumber] [int] NULL,
    [DiffAn] [varchar](max) COLLATE Chinese_PRC_CI_AS NULL,
    [DepID] [int] NULL,
    [BudSubID] [int] NULL,
    [YearExplain] [varchar](max) COLLATE Chinese_PRC_CI_AS NULL,
    [YearBudNumber] [int] NULL,
    [Creator] [int] NULL,
    [Createtime] [datetime] NULL CONSTRAINT [DF_BudInfo_Createtime]  DEFAULT (getdate()),
     CONSTRAINT [PK_BudInfo] PRIMARY KEY CLUSTERED 
    (
    [BID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]GO
    SET ANSI_PADDING OFF
      

  3.   

    你这是做报表,用SQL语句几乎无法完成.
    即使完成了也应该是这样的格式:营销中心_营销收入类预算科目1
    营销中心_营销收入类预算科目2
    ...
      

  4.   

    嗯,SQL出来的效果是这种报表的样子,是复杂了些。但是SQL应该可以实现把,因为大部分我都实现了,只是有一处地方不知道该怎么弄,就是上图中 所有部门那块,那里显示的是所有部门的对应项的和,我已经通过SQL实现了按部门显示,显示每个月的及本年累计,然后各项的统计和也可以计算出来,我先通过上面的行列转换代码生成v_budinfo视图,该视图即可显示每个部门每个预算项相关的值,包括后面的年度累计,然后对这个视图进行统计,就是每个类别的各项值的和,求指点..