1
set ANSI_NULLS ON
2
set QUOTED_IDENTIFIER ON
3
GO
4
/************************************************
5
作 者:
6
创建日期:2009-06-01
7
功能说明:根据所传的组织架构编号,计算清欠率
8
************************************************/
9
CREATE PROCEDURE [dbo].[sp_Get_FinanceRate_ALL]
10
@UnitCode varchar(5000),--组织机构编码
11
@Type int, --查询类型(0代表总部查询,1代表区域查询,2代表楼盘查询,3代表自定义查询
12
@StartDate datetime, --开始日期
13
@EndDate datetime --截止日期
14
AS
15
BEGIN
16
declare @TotalAccountMoney decimal(18,2)--往年应收总额
17
select @TotalAccountMoney=sum(AccountMoney) from Finance_Areceivable where ItemType=7 and year(EndDate)<year(getdate())
18
IF(@startDate<@endDate and @TotalAccountMoney>0)--截止日期必须大于开始日期才统计,往年应收累计必须大于0
19
BEGIN
20
declare @UnitName varchar(50) --组织机构名称
21
Declare @Cursor_Expr Cursor--游标
22
--创建临时表
23
CREATE TABLE #Temp_SumRate
24
(
25
UnitName varchar(1000),
26
SumDate varchar(100),
27
acceptSum decimal(10,4)
28
)
29
IF(@Type=0)--总部查询
30
BEGIN
31
--向临时表中插入数据
32
select @UnitName=UnitName From System_FrameWork Where UnitCode=@UnitCode--根据公司编码得到公司名称
33
INSERT INTO #Temp_SumRate
34
select @UnitName as UnitName,cast(SumYear as varchar)+'年'+dbo.left_fill_zero(SumMonth,2)+'月' as SumDate,acceptSum from
35
--cast(SumYear as varchar)+'年'+case when month(b.GatherDate)<10 then '0'+cast(month(b.GatherDate) as varchar) else cast(month(b.GatherDate) as varchar) end+'月' as SumDate,acceptSum from
36
(
37
select
38
year(b.GatherDate) as SumYear,
39
month(b.GatherDate) as SumMonth,
40
Round(sum(c.GainMoney)/@TotalAccountMoney,4) as acceptSum
41
--sum(c.GainMoney)/@TotalAccountMoney as acceptSum
42
--cast(cast(((sum(c.GainMoney)/@TotalAccountMoney)*100) as decimal(10,2)) as varchar(100)), as acceptSum
43
from Finance_Arecei_ReceiptList as c
44
inner join Finance_Areceivable as a on a.AreceivableID=c.AreceivableID
45
inner join Finance_PReceipt as b on b.ReceiptID=c.ReceiptID
46
where b.GatherDate between @StartDate and @EndDate
47
and exists(select * from V_BuildMessage where UnitCode like @UnitCode+'%' and CompanyID= b.CompanyID)
48
--and b.CompanyID in(select distinct CompanyID from V_BuildMessage where UnitCode like @UnitCode+'%')
49
and c.ItemType=7
50
and year(a.EndDate)<year(getdate())
51
group by year(b.GatherDate),month(b.GatherDate)
52
)as newTable
53
END
54
ELSE IF(@Type=1)--区域查询
55
BEGIN
56
set @Cursor_Expr=Cursor scroll dynamic for
57
select UnitCode,UnitName From System_FrameWork AS s Where exists(
58
select * From V_BuildMessage Where UnitCode like @UnitCode+'%' AND PunitCode=s.UnitCode )
59
Open @Cursor_Expr--打开游标
60
Fetch Next From @Cursor_Expr into @UnitCode,@UnitName--区域信息
61
While @@Fetch_Status=0
62
BEGIN
63
--向临时表中插入数据
64
INSERT INTO #Temp_SumRate
65
select @UnitName AS UnitName,cast(SumYear as varchar)+'年'+dbo.left_fill_zero(SumMonth,2)+'月' as SumDate,acceptSum from
66
--cast(SumYear as varchar)+'年'+case when month(b.GatherDate)<10 then '0'+cast(month(b.GatherDate) as varchar) else cast(month(b.GatherDate) as varchar) end+'月' as SumDate,acceptSum from
67
(
68
select
69
year(b.GatherDate) as SumYear,
70
month(b.GatherDate) as SumMonth,
71
--sum(c.GainMoney)/@TotalAccountMoney as acceptSum
72
Round(sum(c.GainMoney)/@TotalAccountMoney,4) as acceptSum
73
from Finance_Arecei_ReceiptList as c
74
inner join Finance_Areceivable as a on a.AreceivableID=c.AreceivableID
75
inner join Finance_PReceipt as b on b.ReceiptID=c.ReceiptID
76
where b.GatherDate between @StartDate and @EndDate
77
and exists(select * from V_BuildMessage where UnitCode like @UnitCode+'%' and CompanyID= b.CompanyID)
78
--and b.CompanyID in(select distinct CompanyID from V_BuildMessage where UnitCode like @UnitCode+'%')
79
and c.ItemType=7
80
and year(a.EndDate)<year(getdate())
81
group by year(b.GatherDate),month(b.GatherDate)
82
)as newTable
83
Fetch Next From @Cursor_Expr into @UnitCode,@UnitName
84
85
END
86
CLOSE @Cursor_Expr--关闭游标
87
DEALLOCATE @Cursor_Expr--删除游标
88
89
90
END
91
ELSE IF(@Type=2)--楼盘查询
92
BEGIN
93
--向临时表中插入数据
94
INSERT INTO #Temp_SumRate
95
select UnitName,cast(SumYear as varchar)+'年'+dbo.left_fill_zero(SumMonth,2)+'月' as SumDate,acceptSum from
96
--cast(SumYear as varchar)+'年'+case when month(b.GatherDate)<10 then '0'+cast(month(b.GatherDate) as varchar) else cast(month(b.GatherDate) as varchar) end+'月' as SumDate,acceptSum from
97
(
98
select v.UnitCode,v.UnitName,
99
year(b.GatherDate) as SumYear,
100
month(b.GatherDate) as SumMonth,
101
--sum(c.GainMoney)/@TotalAccountMoney as acceptSum
102
Round(sum(c.GainMoney)/@TotalAccountMoney,4) as acceptSum
103
from Finance_Arecei_ReceiptList as c
104
inner join Finance_Areceivable as a on a.AreceivableID=c.AreceivableID
105
inner join Finance_PReceipt as b on b.ReceiptID=c.ReceiptID
106
inner join System_FrameWork as v on v.UnitID=a.CompanyID
107
where b.GatherDate between @StartDate and @EndDate
108
and exists(select * from V_BuildMessage where UnitCode like @UnitCode+'%' and CompanyID= b.CompanyID)
109
--and b.CompanyID in(select distinct companyID from V_BuildMessage where UnitCode like @UnitCode+'%')
110
and c.ItemType=7
111
and year(a.EndDate)<year(getdate())
112
group by v.UnitCode,v.UnitName, year(b.GatherDate),month(b.GatherDate)
113
)as newTable
114
END
115
ELSE IF(@Type=3)--自定义查询
116
Begin
117
set @Cursor_Expr=Cursor scroll dynamic for
118
select UnitCode,UnitName From System_FrameWork Where UnitCode
119
in(select Context from CW_F_GetStringsTable_CLR(@UnitCode,','))
120
Open @Cursor_Expr--打开游标
121
Fetch Next From @Cursor_Expr into @UnitCode,@UnitName
122
While @@Fetch_Status=0
123
BEGIN
124
125
--向临时表中插入数据
126
INSERT INTO #Temp_SumRate
127
select @UnitName AS UnitName,cast(SumYear as varchar)+'年'+dbo.left_fill_zero(SumMonth,2)+'月' as SumDate,acceptSum from
128
--cast(SumYear as varchar)+'年'+case when month(b.GatherDate)<10 then '0'+cast(month(b.GatherDate) as varchar) else cast(month(b.GatherDate) as varchar) end+'月' as SumDate,acceptSum from
129
(
130
select
131
year(b.GatherDate) as SumYear,
132
month(b.GatherDate) as SumMonth,
133
--sum(c.GainMoney)/@TotalAccountMoney as acceptSum
134
Round(sum(c.GainMoney)/@TotalAccountMoney,4) as acceptSum
135
from Finance_Arecei_ReceiptList as c
136
inner join Finance_Areceivable as a on a.AreceivableID=c.AreceivableID
137
inner join Finance_PReceipt as b on b.ReceiptID=c.ReceiptID
138
inner join System_FrameWork as v on v.UnitID=a.CompanyID
139
where b.GatherDate between @StartDate and @EndDate
140
and exists(select * from V_BuildMessage where UnitCode like @UnitCode+'%' and CompanyID= b.CompanyID)
141
--and b.CompanyID in(select distinct companyID from V_BuildMessage where UnitCode like @UnitCode+'%')
142
and c.ItemType=7
143
and year(a.EndDate)<year(getdate())
144
group by year(b.GatherDate),month(b.GatherDate)
145
)as newTable
146
Fetch Next From @Cursor_Expr into @UnitCode,@UnitName
147
END
148
CLOSE @Cursor_Expr--关闭游标
149
DEALLOCATE @Cursor_Expr--删除游标
150
END
151
152
/*--方法1----------------------------------
153
--动态拼接动态列名(如:[2008年12月],[2009年1月],[2009年2月],[2009年3月],[2009年4月],[2009年5月])
154
Declare @tableColumn varchar(8000)
155
SET @tableColumn =''
156
Declare @SumDate varchar(100)
157
declare Cursor_col Cursor for select distinct SumDate from #Temp_SumRate --order by SumYear,SumMonth--声明游标
158
open Cursor_col--打开游标
159
FETCH NEXT FROM Cursor_col INTO @SumDate
160
WHILE @@Fetch_Status=0
161
BEGIN
162
SET @tableColumn =@tableColumn+'['+@SumDate+'],'
163
FETCH NEXT FROM Cursor_col INTO @SumDate
164
END
165
CLOSE Cursor_col--关闭游标
166
DEALLOCATE Cursor_col--释放游标
167
set @tableColumn=SUBSTRING(@tableColumn,1,len(@tableColumn)-1)
168
169
--动态拼接Sql查询语句,实现行列转化
170
declare @sql varchar(8000)
171
set @sql = 'select UnitName as 组织机构, '+@tableColumn +' from #Temp_SumRate PIVOT(MAX(acceptSum) for SumDate in ('+@tableColumn+'))as p'
172
exec(@sql)*/
173
174
--方法2--------------------------------------
175
--动态拼接Sql查询语句,实现行列转化
176
declare @sql varchar(8000)
177
set @sql = 'select UnitName as 组织机构 '
178
select @sql = @sql + ' , cast(cast(100*max(case SumDate when ''' + SumDate + ''' then acceptSum else null end) as decimal(10,2)) as varchar)+''%'' [' + SumDate + ']'from (select distinct SumDate from #Temp_SumRate) as a
179
set @sql = @sql + ' from #Temp_SumRate group by UnitName '
180
exec(@sql)
181
182
--删除临时表
183
DROP TABLE #Temp_SumRate
184
END
185
END
186
187
188
189
190
191
192
193

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193
