ACCESS中的TRANSFORM转换成SQL SERVER中的语句.急急

humanNew 2005-03-21 05:45:55
大家有什么更好的方法没有?
...全文
276 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunshiyu 2005-03-24
  • 打赏
  • 举报
回复
create table n(f1 varchar(10),f2 float,f3 datetime)
insert into n values('A1', 1.00 , '2005-01-01')
insert into n values('A1', 1.00 , '2005-01-01')
insert into n values('A2', 2.00 , '2005-01-02')
insert into n values('A2', 2.00 , '2005-01-03')
insert into n values('A1', 3.00 , '2005-01-05')
insert into n values('A2', 3.00 , '2005-01-06')



select f3 ,a1=isnull((case f1 when 'a1' then sum(f2) end),0),a2=isnull((case f1 when 'a2' then sum(f2) end),0) from n group by f3,f1 order by f3
zlt982001 2005-03-23
  • 打赏
  • 举报
回复
这是一个通用的生成交叉表的存储过程

CREATE procedure CorssTab
@strTabName as varchar(50) = 'Employees', --此处放表名
@strCol as varchar(50) = 'City', --表头分组依据字段
@strGroup as varchar(50) = 'TitleOfCourtesy',--分组字段
@strNumber as varchar(50) = 'ReportsTo', --被统计的字段
@strSum as varchar(10) = 'Sum' --运算方式
AS

DECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标
begin
SET nocount ON
SET @strsql ='select ' + @strGroup + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段

OPEN corss_cursor
while (0=0)
BEGIN
FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol
INTO @strTmpCol
if (@@fetch_status<>0) break
SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询
END
SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾

EXECUTE(@strsql) --执行




IF @@error <>0 RETURN @@error --如果出错,返回错误代码
CLOSE corss_cursor
DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功

end
GO

几点说明:
a、这是一个通用存储过程,使用时@strTabName、@strCol、@strGroup、@strNumber、@strSum几个变量设置一下就可以用到其他表上,其中结果集的第二列我加了个合计列
b、为了测试方便,我在存储过程中设置了默认值,就是前面提到的Employees表,这样直接运行时就可以出来我上面提到的结果。
c、使用时,可以把上面的代码复制到企业管理器的查询设计界面Sql窗格,或者查询分析器里运行一下(注意正确选择NorthWind数据库),就可以生成一个存储过程:CorssTab,然后直接运行CorssTab,如果出现本文前面类似的窗格,就表示运行成功了。
d、假如用于其它表,首先需要在你的用户数据库里生成此存储过程(当然也可以放到Master里,然后再加个变量:@DataBase,赋值为数据库名称,然后在上面代码打开指定数据库,这样所有的数据库都可以调用它),当你调用时,采取以下格式:

CorssTab @strTabName = 'Orders', @strCol = 'DATEPART(yy, OrderDate)',@strGroup = 'CustomerID', @strNumber = 'OrderID', @strSum = 'Count'
humanNew 2005-03-22
  • 打赏
  • 举报
回复
例如:
F1 F2 F3
A1 1.00 2005-01-01
A1 1.00 2005-01-01
A2 2.00 2005-01-02
A2 2.00 2005-01-03
A1 3.00 2005-01-05
A2 3.00 2005-01-06
实现效果
F3 A1 A2
2005-01-01 2.00 0.00
2005-01-02 0.00 2.00
2005-01-03 0.00 2.00
2005-01-05 3.00 0.00
2005-01-06 0.00 3.00
jinjazz 2005-03-21
  • 打赏
  • 举报
回复
你要什么效果,把数据贴出来看看
humanNew 2005-03-21
  • 打赏
  • 举报
回复
要分组的,GROUP 也用CASE WHEN?
解决了另给一百分.
humanNew 2005-03-21
  • 打赏
  • 举报
回复
PIVOT呢?
jinjazz 2005-03-21
  • 打赏
  • 举报
回复
case when吧

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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