sql server2005练习题

1、CREATE table tt (a int , b int , c int , d int , e int , f int, g int)
insert tt select 1,2,3,14,5,6,7
insert tt select 11,4,9,4,12,26,7
insert tt select 1,12,4,4,10,16,9
--表中共有a-g七列,a-g列的标准值分别为:1,2,3,4,5,6,7. 要求只要任意三列
--的值等于标准值即为符合要求行,要求给出能搜出所有符合要求行的SQL语句。
--上表中行1,2,3,14,5,6,7即为符合要求行。

解:
CREATE TABLE th
(a int , b int , c int , d int , e int , f int, g int)
INSERT INTO th
SELECT 1 ,2,3,4,5,6,7
GO


SELECT * FROM tt WHERE ((CASE tt.a WHEN 1 THEN 1 ELSE 0 END )+
(CASE tt.b WHEN 2 THEN 1 ELSE 0 END )+
(CASE tt.c WHEN 3 THEN 1 ELSE 0 END )+
(CASE tt.d WHEN 4 THEN 1 ELSE 0 END )+
(CASE tt.e WHEN 5 THEN 1 ELSE 0 END )+
(CASE tt.f WHEN 6 THEN 1 ELSE 0 END ) +
(CASE tt.g WHEN 7 THEN 1 ELSE 0 END ))>3;

2、--sql语句分类汇总
--生成一个表
CREATE TABLE ta (仓库名称 VARCHAR(9),商品编码 VARCHAR(10),商品名称 VARCHAR(20),库存 INT) ;
GO
INSERT INTO ta
SELECT '上海仓库','07-c01-000','NOKIA诺基亚C',122 UNION ALL
SELECT '上海仓库','07-c01-098','SonyEricsson索爱W380',244 UNION ALL
SELECT '广州仓库','07-c01-098','SonyEricsson索爱W380',355 UNION ALL
SELECT '成都仓库','07-c01-026','Nokia诺基亚N72',58 UNION ALL
SELECT '广州仓库','07-c01-026','Nokia诺基亚N72',62 UNION ALL
SELECT '成都仓库','07-c01-098','SonyEricsson索爱W380',88 UNION ALL
SELECT '成都仓库','07-c01-000','NOKIA诺基亚C',30
GO
--
--要求写一条SQL查询语句,得到如下汇总结果:
--仓库名称     商品编码    商品名称             库存
----------- ---------- -------------------- -----------
--上海仓库    07-c01-000 NOKIA诺基亚C                   122
--成都仓库    07-c01-000 NOKIA诺基亚C                30
--总库存:                                                                     152
--成都仓库    07-c01-026 Nokia诺基亚N72              58
--广州仓库    07-c01-026 Nokia诺基亚N72               62
--总库存:                                                                        120
--成都仓库    07-c01-098 SonyEricsson索爱W380   88
--上海仓库    07-c01-098 SonyEricsson索爱W380   244
--广州仓库    07-c01-098 SonyEricsson索爱W380   355
--总库存:                                                                      687

解:

一条sql语句写出,我现在有点思路,但是还没有写出来。看网上对于这种形式的题型好像有几种做法。我先列出我自己的先。不尽完美的是我是用分开的语句写的,没有完成上面的要求。

--生成另外一个表
CREATE TABLE tai (仓库名称 VARCHAR(9),商品编码 VARCHAR(10),商品名称 VARCHAR(20),库存 INT) ;
GO
--将with rollup的信息插入tai中
INSERT INTO tai SELECT 仓库名称,商品编码,商品名称 ,SUM(库存) AS 库存 FROM TA
GROUP BY 商品编码,仓库名称,商品名称 WITH rollup;
GO
--对tai进行操作: 删掉多余行
DELETE FROM tai WHERE (仓库名称 IS NOT NULL) AND ( 商品名称 IS NULL) AND (商品编码 IS NOT NULL) ;
GO
--对tai的必要项的值进行修改
UPDATE tai SET 仓库名称='总库存' WHERE 仓库名称 IS NULL;
GO
UPDATE tai SET 商品编码='' WHERE 仓库名称='总库存';
GO
UPDATE tai SET 商品名称='' WHERE 商品名称 IS NULL ;
GO
--最后输出汇总图表
SELECT * FROM tai ;
GO

--最后可以把它连起来可以生成一个语句就可以啦,或者生成存储过程

上面的思路算是比较清晰的了。网上另有些方法,不过思路跟上面的过程差不多,这里提一下这个模型:

用Grouping替换NULL值

SELECT CASE WHEN (GROUPING(编码) = 1) THEN 'ALL'
            ELSE ISNULL(编码, 'UNKNOWN')
       END AS 编码,
       CASE WHEN (GROUPING(仓库) = 1) THEN 'ALL'
            ELSE ISNULL(仓库, 'UNKNOWN')
       END AS 仓库,
       SUM(数量) AS 数量
FROM A
GROUP BY 编码, 仓库 WITH ROLLUP

--适当的运用Case函数

等有了更好的方法,再提供。

3、CREATE TABLE ti (TypeId INT,TypeName VARCHAR(10),TypeParentID INT)
INSERT ti SELECT 2, '外语',   NULL
UNION ALL SELECT 17, '英语',   2
UNION ALL SELECT 18,'法语' ,2
UNION ALL SELECT 19, '德语' , 2
UNION ALL SELECT 1, '计算机' ,NULL
UNION ALL SELECT 8, '编程' ,1
GO

--要求写一条SQL查询语句,得到如下汇总结果:
--TypeID      TypeName   ParentTypeName
------------- ---------- --------------
--17          英语        外语
--18          法语        外语
--19          德语        外语
--8           编程        计算机

解:

SELECT aaa.TypeId,aaa.TypeName,bbb.typename
FROM (SELECT TYPEid,typename,typeparentid FROM ti WHERE typeparentid IS NOT NULL) AS aaa
,(SELECT TYPEid,typename FROM ti WHERE typeparentid IS NULL) AS bbb
WHERE aaa.TypeParentID=bbb.typeid;

posted @ 2009-03-27 23:43  Devil_Zhang  阅读(558)  评论(0编辑  收藏  举报