面试题 写SQL语句
如题:
一、有表Sales
Region Product Qty
Beijing A 87
Beijing D 92.5
Tianjin B 86
Tianjin A 82
... ...
让做一交叉表 显示某一地区各个产品的销售量 用存储过程实现 即实现如下结构
Region A B C D ... ...
Beijing 87 55 58 92.5 ... ...
Tianjin 82 86 55 57 ... ...
... ...
二、有表A(fa,fb,fc,fd)和B(fa,fb,fc,fd) 令其连接(A.fa=B.fa and A.fb=B.fb) 通过更新A表的fc更新B表的fc 写出SQL语句 我想
了半天 写成了这样:
update A,B
set B.fc=newValue
where A.fa=B.fa and A.fb=B.fb
呵呵 肯定是把人丢在外边了 我想它实际是想让写一个触发器来着 更新A表然后通过触发器更新B表
诸位帮看下
------解决方案----------------------参考
/*
建立日期:2006-12-29
参考网址:http://community.csdn.net/Expert/topic/5259/5259689.xml?temp=.4286768
功能描述:
行列转换(将表旋转90度)
表T:
姓名 语文 数学 物理
----------------------------------
张三 80 90 85
李四 85 92 82
要求结果:
课程 张三 李四
----------------------
语文 80 85
数学 90 92
物理 85 82
*/
--创建环境
CREATE TABLE T(姓名 nvarchar(10), 语文 int, 数学 int, 物理 int)
INSERT T SELECT '张三 ', 80, 90, 85
UNION ALL SELECT '李四 ', 85, 92, 82
--SQL
--步骤一:生成中间数据表
DECLARE @sql varchar(8000)
SET @sql = 'CREATE TABLE T2(课程 nvarchar(10) '
SELECT @sql=@sql+ ', '+姓名+ ' nvarchar(10) ' FROM T
SET @sql=@sql+ ') '
EXEC(@sql)
--PRINT @sql
--打印结果:CREATE TABLE T2(课程 nvarchar(10),张三 nvarchar(10),李四 nvarchar(10))
--步骤二:借助中间数据表实现行列转换
DECLARE @name nvarchar(10)
DECLARE T_cursor CURSOR FOR
SELECT name FROM syscolumns
WHERE id=OBJECT_ID( 'T ') and colid> 1
ORDER BY colid
OPEN T_cursor
FETCH NEXT FROM T_cursor INTO @name
WHILE @@FETCH_STATUS=0
BEGIN
EXEC( 'SELECT '+@name+ ' AS T INTO T3 FROM T ')
SET @sql= 'INSERT INTO T2 SELECT ' ' '+@name+ ' ' ' '
SELECT @sql=@sql+ ', ' ' '+RTRIM(T)+ ' ' ' ' FROM T3
EXEC(@SQL)
EXEC( 'DROP TABLE T3 ')
FETCH NEXT FROM T_cursor INTO @name
END
CLOSE T_cursor
DEALLOCATE T_cursor
--查看处理结果
SELECT * FROM T
SELECT * FROM T2
--删除环境
DROP TABLE T, T2
------解决方案--------------------http://topic.csdn.net/t/20061227/15/5259689.html
此贴作者也给出了另一种思路
可以参考下
------解决方案--------------------------question 1
/*Region Product Qty
Beijing A 87
Beijing D 92.5
Tianjin B 86
Tianjin A 82
*/
create table commodity
(
region varchar(1000) not null,
product char(1) not null,
qty int not null
)
insert into commodity
select 'beijing ', 'A ',87 union all
select 'beijing ', 'D