已知 X Y
a 1001
a 1001.01
a 1001.02
如何可以得到下边的结果呢
A B C D
a 1001 1001.01 1001.02最好是 可以动态变化 如果 再有 a 1001.03 的话 再加上 E 1001.03
不知道我说明白没有的
a 1001
a 1001.01
a 1001.02
如何可以得到下边的结果呢
A B C D
a 1001 1001.01 1001.02最好是 可以动态变化 如果 再有 a 1001.03 的话 再加上 E 1001.03
不知道我说明白没有的
Insert TEST Select 'a', 1001
Union All Select 'a', 1001.01
Union All Select 'a', 1001.02
Union All Select 'a', 1001.03
GO
Select ID=Identity(Int,1,1),* Into #T From TEST
Declare @S Varchar(8000)
Select @S=''
Select @S=@S+','+Rtrim(Y) +' As '+Char(65+ID) From #T Order By ID
Select @S='Select X As A'+@S+' From TEST Group By X'
EXEC(@S)
GO
Drop Table TEST,#T
GO
/*
A B C D E
a 1001.00 1001.01 1001.02 1001.03
*/
--魚大哥的有多個X的值會有問題
Create Table TEST(X Varchar(10),Y Numeric(10,2))
Insert TEST Select 'a', 1001
Union All Select 'a', 1001.01
Union All Select 'a', 1001.02
Union All Select 'a', 1001.03
union all select 'b', 1000
GO
Select ID=(select count(1) from test t where t.x=test.x and t.y<test.y),* Into #T From TEST order by x,y
Declare @S Varchar(8000)
Select @S=''
select @s=@s+',sum(case when id='+rtrim([id])+' then y else 0 end) as ['+char(66+[id])+']' from #t group by [id] order by [id]
Select @S='Select X As A'+@S+' From #T Group by x'
EXEC(@S)
GO
Drop Table TEST,#TA B C D E
------------------------------------------------
a 1001.00 1001.01 1001.02 1001.03
b 1000.00 .00 .00 .00
Insert TEST Select 'a', 1001
Union All Select 'a', 1001.01
Union All Select 'a', 1001.02
Union All Select 'a', 1001.03
Union All Select 'b', 1001
GO
Select (Select Count(*) From TEST WHere X=A.X And Y<=A.Y) As ID,* Into #T From TEST A
Declare @S Varchar(8000)
Select @S=''
Select @S=@S+',Max(Case ID When '+Rtrim(ID) +' Then Y Else 0 End) As '+Char(65+ID) From #T Group By ID Order By ID
Select @S='Select X As A'+@S+' From #T Group By X'
EXEC(@S)
GO
Drop Table TEST,#T
GO
/*
A B C D E
a 1001.00 1001.01 1001.02 1001.03
b 1001.00 .00 .00 .00
*/
試試看,沒測試
declare @s varchar(8000)
set @s=''
select @s=@s+',sum(case when 科目代码='+rtrim(科目代码)+' then 余额 else 0 end) as '+rtrim(科目代码) from T group by 科目代码 order by 科目代码
select @s='select 公司账套号,公司名称 , 期间,时间戳 '+@s+' from T group by 公司账套号,公司名称 , 期间,时间戳 '
exec(@s)
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As '+科目代码
From TableName Group By 科目代码 Order By 科目代码
Select @S=N'Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From TableName Group By 公司账套号, 公司名称,期间,时间戳'
EXEC(@S)
select @s=@s+',sum(case when 科目代码='''+rtrim(科目代码)+''' then 余额 else 0 end) as ['+rtrim(科目代码)+'] ' from T group by 科目代码 order by 科目代码
(ID Int,
公司账套号 Char(11),
公司名称 Nvarchar(20),
期间 Nvarchar(20),
科目代码 Varchar(20),
科目名称 Nvarchar(50),
余额 Numeric(20,2),
时间戳 Varchar(20))
Insert TEST Select 1, '001.004.001', N'霸州分公司', N'2006年8期', '1001', N'现金', -9069.59, '2006-8-9 6:00:00'
Union All Select 2, '001.004.001', N'霸州分公司', N'2006年8期', '1002', N'银行存款', -2502380.32, '2006-8-9 6:00:00'
Union All Select 3, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01', N'可动用货币资金', -501285.21, '2006-8-9 6:00:00'
Union All Select 4, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.01', N'中行霸州支行(08846708091001)', -297010.82, '2006-8-9 6:00:00'
Union All Select 5, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.02', N'中行廊坊分行(08846708093001)', -111169.41, '2006-8-9 6:00:00'
Union All Select 6, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.03', N'工行霸州支行(0410001119248039970)', -93066.98, '2006-8-9 6:00:00'
Union All Select 7, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.04', N'中行廊坊分行(5477661300004217)', -3.45, '2006-8-9 6:00:00'
Union All Select 8, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.05', N'中行廊坊分行(5477661300052612)', -34.55, '2006-8-9 6:00:00'
Union All Select 9, '001.004.001', N'霸州分公司', N'2006年8期', '1002.03', N'消费贷款保证金', -2001095.11, '2006-8-9 6:00:00'
GO
Declare @S Nvarchar(4000)
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As ['+科目代码+']'
From TEST Group By 科目代码 Order By 科目代码
Select @S=N'Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From TEST Group By 公司账套号, 公司名称,期间,时间戳'
EXEC(@S)
GO
Drop Table TEST
/*
公司账套号 公司名称 期间 时间戳 1001 1002 1002.01 1002.01.01 1002.01.02 1002.01.03 1002.01.04 1002.01.05 1002.03
001.004.001 霸州分公司 2006年8期 2006-8-9 6:00:00 -9069.59 -2502380.32 -501285.21 -297010.82 -111169.41 -93066.98 -3.45 -34.55 -2001095.11*/
授人与鱼,不如授人与渔呀
----------------------------------------不要吃鱼呀
最好 授人与鱼,再授人与渔
问题是我的表已经存在了 不用在自己建了 鱼哥我只需要哪些代码啊??
---------------------------------------------
那就只需要這段代碼Declare @S Nvarchar(4000)
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As ['+科目代码+']'
From TEST Group By 科目代码 Order By 科目代码
Select @S=N'Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From TEST Group By 公司账套号, 公司名称,期间,时间戳'
EXEC(@S)
將其中的兩處TEST表名改為你自己的視圖名t_nbwl2006
你將我以下這段代碼完整復制到查詢分析器中執行下,然後對比下看看問題出在哪。Create Table TEST
(ID Int,
公司账套号 Char(11),
公司名称 Nvarchar(20),
期间 Nvarchar(20),
科目代码 Varchar(20),
科目名称 Nvarchar(50),
余额 Numeric(20,2),
时间戳 Varchar(20))
Insert TEST Select 1, '001.004.001', N'霸州分公司', N'2006年8期', '1001', N'现金', -9069.59, '2006-8-9 6:00:00'
Union All Select 2, '001.004.001', N'霸州分公司', N'2006年8期', '1002', N'银行存款', -2502380.32, '2006-8-9 6:00:00'
Union All Select 3, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01', N'可动用货币资金', -501285.21, '2006-8-9 6:00:00'
Union All Select 4, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.01', N'中行霸州支行(08846708091001)', -297010.82, '2006-8-9 6:00:00'
Union All Select 5, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.02', N'中行廊坊分行(08846708093001)', -111169.41, '2006-8-9 6:00:00'
Union All Select 6, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.03', N'工行霸州支行(0410001119248039970)', -93066.98, '2006-8-9 6:00:00'
Union All Select 7, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.04', N'中行廊坊分行(5477661300004217)', -3.45, '2006-8-9 6:00:00'
Union All Select 8, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.05', N'中行廊坊分行(5477661300052612)', -34.55, '2006-8-9 6:00:00'
Union All Select 9, '001.004.001', N'霸州分公司', N'2006年8期', '1002.03', N'消费贷款保证金', -2001095.11, '2006-8-9 6:00:00'
GO
Declare @S Nvarchar(4000)
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As ['+科目代码+']'
From TEST Group By 科目代码 Order By 科目代码
Select @S=N'Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From TEST Group By 公司账套号, 公司名称,期间,时间戳'
EXEC(@S)
GO
Drop Table TEST
/*
公司账套号 公司名称 期间 时间戳 1001 1002 1002.01 1002.01.01 1002.01.02 1002.01.03 1002.01.04 1002.01.05 1002.03
001.004.001 霸州分公司 2006年8期 2006-8-9 6:00:00 -9069.59 -2502380.32 -501285.21 -297010.82 -111169.41 -93066.98 -3.45 -34.55 -2001095.11*/
1行被上次查询影响 依然是这个问题
-----------------------------------------------
这个不是问题了。
到查询分析器看看能不能运行出你要的结果吧
触发器怎么回事?
--------------
沒關係的,當我沒說。你執行的時候不能看到你要的結果嗎??
(ID Int,
公司账套号 Char(11),
公司名称 Nvarchar(20),
期间 Nvarchar(20),
科目代码 Varchar(20),
科目名称 Nvarchar(50),
余额 Numeric(20,2),
时间戳 Varchar(20))
Insert TEST Select 1, '001.004.001', N'霸州分公司', N'2006年8期', '1001', N'现金', -9069.59, '2006-8-9 6:00:00'
Union All Select 2, '001.004.001', N'霸州分公司', N'2006年8期', '1002', N'银行存款', -2502380.32, '2006-8-9 6:00:00'
Union All Select 3, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01', N'可动用货币资金', -501285.21, '2006-8-9 6:00:00'
Union All Select 4, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.01', N'中行霸州支行(08846708091001)', -297010.82, '2006-8-9 6:00:00'
Union All Select 5, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.02', N'中行廊坊分行(08846708093001)', -111169.41, '2006-8-9 6:00:00'
Union All Select 6, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.03', N'工行霸州支行(0410001119248039970)', -93066.98, '2006-8-9 6:00:00'
Union All Select 7, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.04', N'中行廊坊分行(5477661300004217)', -3.45, '2006-8-9 6:00:00'
Union All Select 8, '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.05', N'中行廊坊分行(5477661300052612)', -34.55, '2006-8-9 6:00:00'
Union All Select 9, '001.004.001', N'霸州分公司', N'2006年8期', '1002.03', N'消费贷款保证金', -2001095.11, '2006-8-9 6:00:00'
GO
Declare @S Nvarchar(4000)
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As ['+科目代码+']'
From TEST Group By 科目代码 Order By 科目代码
Select @S=N'Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From TEST Group By 公司账套号, 公司名称,期间,时间戳'
EXEC(@S)
GO
Drop Table TEST
這段代碼放到查詢分析器中也有錯誤??我這裡沒辦法上QQ的。
set @s=''
select @s=@s+',sum(case when 科目代码='''+rtrim(科目代码)+''' then 余额 else 0 end) as ['+rtrim(科目代码)+'] ' from T group by 科目代码 order by 科目代码
select @s='select 公司账套号,公司名称 , 期间,时间戳 '+@s+' from T group by 公司账套号,公司名称 , 期间,时间戳 '
exec(@s)
上面的代码没有错误 我的表里 没有id那个字段
-------------------------
沒有ID一樣是可以運行的啊。
Create Table TEST
(公司账套号 Char(11),
公司名称 Nvarchar(20),
期间 Nvarchar(20),
科目代码 Varchar(20),
科目名称 Nvarchar(50),
余额 Numeric(20,2),
时间戳 Varchar(20))
Insert TEST Select '001.004.001', N'霸州分公司', N'2006年8期', '1001', N'现金', -9069.59, '2006-8-9 6:00:00'
Union All Select '001.004.001', N'霸州分公司', N'2006年8期', '1002', N'银行存款', -2502380.32, '2006-8-9 6:00:00'
Union All Select '001.004.001', N'霸州分公司', N'2006年8期', '1002.01', N'可动用货币资金', -501285.21, '2006-8-9 6:00:00'
Union All Select '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.01', N'中行霸州支行(08846708091001)', -297010.82, '2006-8-9 6:00:00'
Union All Select '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.02', N'中行廊坊分行(08846708093001)', -111169.41, '2006-8-9 6:00:00'
Union All Select '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.03', N'工行霸州支行(0410001119248039970)', -93066.98, '2006-8-9 6:00:00'
Union All Select '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.04', N'中行廊坊分行(5477661300004217)', -3.45, '2006-8-9 6:00:00'
Union All Select '001.004.001', N'霸州分公司', N'2006年8期', '1002.01.05', N'中行廊坊分行(5477661300052612)', -34.55, '2006-8-9 6:00:00'
Union All Select '001.004.001', N'霸州分公司', N'2006年8期', '1002.03', N'消费贷款保证金', -2001095.11, '2006-8-9 6:00:00'
GO
Declare @S Nvarchar(4000)
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As ['+科目代码+']'
From TEST Group By 科目代码 Order By 科目代码
Select @S=N'Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From TEST Group By 公司账套号, 公司名称,期间,时间戳'
EXEC(@S)
GO
Drop Table TEST
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As ['+科目代码+']'
From dbo.t_nbwl2006 Group By 科目代码 Order By 科目代码
Select @S=N'Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From dbo.t_nbwl2006 Group By 公司账套号, 公司名称,期间,时间戳'
EXEC(@S)服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'As' 附近有语法错误。
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As ['+科目代码+']'
From dbo.t_nbwl2006 Group By 科目代码 Order By 科目代码
Select @S=N'Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From dbo.t_nbwl2006 Group By 公司账套号, 公司名称,期间,时间戳'
print @s ---加這句看看
--EXEC(@S)把@s貼出來看看
Drop View V_List
Declare @S Nvarchar(4000)
Select @S=''
Select @S=@S+N',SUM(Case When 科目代码='''+科目代码+N''' Then 余额 Else 0 End) As ['+科目代码+']'
From t_nbwl2006 Group By 科目代码 Order By 科目代码
Select @S=N'Create View V_List As Select 公司账套号, 公司名称,期间,时间戳'+@S+N' From t_nbwl2006 Group By 公司账套号, 公司名称,期间,时间戳'
EXEC(@S)Select * From V_List
Select Count(*) As Count From dbo.t_nbwl2006 Group By 科目代码 Order By 科目代码看看有多少紀錄
这是那个@s
36
12
3
3
650
635
9
3
3
3
527
3
3
300
221
191
125
84
3
60
42
30
24
18
12
3
3
3
6
9
6
157
3
3
87
45
39
21
9
3
6
6
9
12
6
6
3
6
3
3
3
3
3
3
3
3
3
1
1
1
1
3
123
111
42
15
6
36
3
27
9
3
3
3
3
3
3
3
3
3
3
516
437
9
3
15
6
3
3
6
6
6
9
3
3
6
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
238
148
6
3
184
81
57
16
6
6
189
3
3
18
18
12
6
3
3
95
53
38
21
12
3
98
53
35
21
12
3
9
3
21
3
3
3
3
3
30
9
6
9
3
3
545
3
3
3
458
12
120
3
12
6
3
618
492
3
3
3
18
9
15
3
3
9
3
12
3
9
6
3
6
3
3
225
3
6
3
3
3
3
3
3
3
6
3
3
3
6
3
272
3
3
3
3
3
3
3
6
3
3
3
3
198
3
3
3
3
3
3
3
3
3
3
139
3
3
3
3
3
3
3
98
72
66
60
51
45
63
51
47
48
48
31
25
31
17
11
15
12
9
6
6
9
9
9
9
9
12
6
6
9
12
3
6
3
6
3
3
6
3
3
3
3
3
3
3
3
3
3
3
3
3
507
3
3
3
2
24
3
9
24
9
9
12
15
3
9
222
6
6
15
6
6
9
6
3
6
4
162
3
3
3
3
3
6
3
6
135
9
3
6
3
6
3
3
143
3
3
3
3
3
3
3
3
145
112
83
94
105
75
3
56
3
3
77
3
3
3
81
74
67
56
57
48
59
69
71
63
54
54
63
36
54
42
48
33
33
57
39
21
21
24
15
25
13
27
15
19
12
14
9
15
9
12
12
9
3
3
9
3
15
3
9
6
9
12
9
3
6
6
6
6
3
3
3
3
3
3
3
3
3
3
3
6
6
3
3
40
18
6
3
6
3
3
12
354
3
3
22
3
3
1
11
3
3
3
3
432
380
6
6
141
6
6
3
38
6
3
3
3
3
3
3
3
3
3
3
3
3
3
150
3
72
6
3
45
33
21
18
15
15
12
12
15
3
3
3
3
3
3
3
3
3
3
13
3
3
3
3
3
3
3
3
3
3
12
3
3
3
3
3
3
3
3
3
3
12
3
3
3
3
3
3
3
3
15
15
9
12
9
9
9
9
9
9
9
9
9
9
9
9
11
8
8
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
3
6
6
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
12
12
6
6
6
3
3
6
566
506
9
6
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
362
63
54
18
15
3
3
3
54
15
3
6
3
3
3
3
3
3
3
3
3
3
3
27
314
3
126
3
3
86
3
3
3
3
53
3
11
15
12
3
3
3
72
39
24
9
6
6
6
3
3
3
3
3
3
3
3
3
683
9
3
3
6
3
3
3
3
3
663
132
36
3
3
3
3
3
3
21
6
3
3
3
96
24
3
6
6
6
3
3
9
348
237
6
6
6
6
6
6
3
3
3
12
15
15
12
12
6
3
3
3
3
3
3
120
9
3
6
6
3
3
66
6
6
24
12
9
9
9
3
3
3
3
3
3
3
3
65
47
3
3
6
141
63
21
9
9
9
442
36
3
3
3
24
21
6
3
9
6
3
3
3
3
3
204
6
3
3
3
3
67
6
3
1
1
683
9
99
709
506
701
141
477
682
142
18
222
74
143
244
9
9
12
482
253
3
260
231
224
713
516
3
3
3
3
27
3
3
27
3
3
33
3
15
3
18
3
24
3
3
15
3
18
3
15
3
3
205
6
3
18
3
3
9
3
12
3
6
3
3
12
3
12
6
3
3
3
3
177
3
3
3
3
6
3
12
3
3
3
3
6
3
6
3
12
3
3
3
138
6
6
3
6
3
3
3
6
3
3
3
3
3
3
3
3
3
111
3
3
3
3
3
3
3
3
3
3
113
3
3
3
3
3
3
6
6
3
3
3
3
3
3
3
3
3
102
3
3
3
3
3
78
3
3
3
3
3
51
3
3
3
3
3
72
3
3
3
3
3
3
3
3
3
48
3
3
3
3
3
42
3
3
3
3
3
3
30
3
18
3
9
3
3
3
3
3
3
14
3
3
18
12
8
8
3
6
3
3
3
3
3
6
3
3
6
3
6
6
3
3
294
18
15
12
9
6
6
3
6
133
3
6
6
3
3
105
54
45
45
3
42
33
30
3
21
24
30
3
3
3
3
3
3
3
3
3
21
3
3
3
3
3
3
3
3
3
3
3
3
3
3
18
3
15
3
18
21
3
15
12
12
6
3
3
3
3
3
3
3
3
6
3
3
6
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
6
3
3
3
6
3
6
6
6
3
3
641
6
3
6
6
3
3
3
3
36
39
24
30
24
21
9
6
9
495
3
3
3
3
3
3
3
3
3
3
12
3
3
3
3
3
6
476
3
3
6
3
3
3
438
3
300
228
3
3
3
3
3
166
126
93
69
57
42
33
21
21
9
6
6
6
3
3
3
3
3
33
3
6
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
15
3
3
3
3
3
12
3
3
3
3
117
24
12
6
6
3
3
3
6
6
6
3
3
572
6
3
3
395
3
3
3
320
3
105
45
9
3
15
9
6
3
287
284
21
284
3
609
3
554
48
42
39
3
548
3
3
3
3
3
3
3
3
13
7
2
2
1
8
12
3
3
1
1
1
3
3
7
6
1
3
5
3
5
22
7
6
20
4
17
18
5
6
7
5
3
18
20
15
1
4
1
8
4
11
1
3
4
2
2
1
1
20
2
2
19
1
这是哪个count
1351行
-------------
難道你要將這1351行,全部轉為列嗎??太多了點,即使拆分為多個@S來執行,也太多了點。