当前位置: 代码迷 >> SQL >> Sql查询技艺实例
  详细解决方案

Sql查询技艺实例

热度:86   发布时间:2016-05-05 14:53:07.0
Sql查询技巧实例

Sql查询技巧

?

1? A04中的含有ABCD四个字段,当按A字段分组后,如果D1,则只统计B的值,如果D0,则只统计C的值。

CREATE TABLE A04(A VARCHAR(20),B INT,C INT,D INT)

INSERT INTO A04 VALUES('01',20,7,'0')

INSERT INTO A04 VALUES('01',10,8,'1')

INSERT INTO A04 VALUES('02',20,7,'1')

INSERT INTO A04 VALUES('02',10,8,'0')

?

?

SELECT A,SUM(CASE D WHEN 1 THEN B WHEN 0 THEN C END) FROM A04 GROUP BY A

?

2? 如何实现有一组有规则的编号(如200305310001200305310999

?

DECLARE @I INT,@C VARCHAR(20)

SELECT @I=1

WHILE @I<1000 BEGIN

? SELECT @C=CASE WHEN @I<10 THEN '000'+CAST(@I AS CHAR(1))

???????????????? WHEN @I BETWEEN 10 AND 99 THEN '00'+CAST(@I AS CHAR(2))

???????????????? WHEN @I BETWEEN 100 AND 999 THEN '0'+CAST(@I AS CHAR(3))

??????????? END

? SELECT @C=CONVERT(VARCHAR(20),GETDATE(),112)[email protected]

? SELECT @C???? --在查询分析器中输出

? SELECT @[email protected]+1

END

?

3、现在有三个表,结构如下

Score(FScoreId? 成绩记录号,FSubID 课程号,FStdID 学生号,FScore??? 成绩)

student:FID? 学生号,FName? 姓名)

subject:FSubID?? 课程号,FSubName 课程名),??

怎么能实现这个表:

姓名?? 英语?? 数学?? 语文? 历史

张萨?? 78???? 67???? 89??? 76

王强?? 89???? 67???? 84??? 96??

李三?? 70???? 87???? 92??? 56

李四?? 80???? 78???? 97??? 66

SELECT A.FNAME AS 姓名,

????? 英语 = SUM(CASE B.FSUBNAME WHEN '英语' THEN C.FSCORE END),

????? 数学 = SUM(CASE B.FSUBNAME WHEN '数学' THEN C.FSCORE END),

????? 语文 = SUM(CASE B.FSUBNAME WHEN '语文' THEN C.FSCORE END),

????? 历史 = SUM(CASE B.FSUBNAME WHEN '历史' THEN C.FSCORE END)

FROM STUDENT A, SUBJECT B, SCORE C

WHERE A.FID = C.FSTDID AND B.FSUBID = C.FSUBID GROUP BY A.FNAME

?

4、有两个表,用一条SQL语句算出商品A,B目前还剩多少?表结构如下:

商品名称mc? 商品总量sl? 表一(AAA)

? A???????? 100

? B???????? 120

商品名称mc? 出库数量sl 表二(BBB)

?? A???????? 10

?? A???????? 20

?? B???????? 10

?? B???????? 20

SELECT TA.商品名称,A-B AS 剩余数量 FROM

(SELECT 商品名称,SUM(商品总量) AS A FROM AAA GROUP BY 商品名称)TA,

(SELECT 商品名称,SUM(出库数量) AS B FROM BBB GROUP BY 商品名称)TB

WHERE TA.商品名称=TB.商品名称

?

6、有一个商品销售表,记载了某月商品的销售数量,现在要为所有商品排名次,放到一个单独的字段中,就是说达到右边显示的效果,如何作?

?

BU1032??????? 5??????? NULL????? BU1032 5? 2

PS2091??????? 3??????? NULL????? PS2092 3? 3

PC8888??????? 50??????? NULL????? PC8888 50 1

?

UPDATE X SET ORD=(SELECT COUNT(*)+1 FROM X B WHERE B.QTY>X.QTY)

?

7、本人有一张表单, 要求统计COL1~COL6中不等于2的列的个数,数据如下:

————————————————————————————————

ROW_ID |? COL1? |? COL2? |? COL3? |? COL4? |? COL5? |? COL6? |

? 1??? |??? 2?? |??? 1?? |??? 1?? |??? 2?? |??? 3?? |??? 2?? |

? 2??? |??? 1?? |??? 1?? |??? 2?? |??? 2?? |??? 2?? |??? 2?? |

? 3??? |??? 2?? |??? 3?? |??? 2?? |??? 2?? |??? 1?? |??? 2?? |

? 4??? |??? 2?? |??? 2?? |??? 2?? |??? 2?? |??? 1?? |??? 2?? |

? 5??? |??? 1?? |??? 2?? |??? 2?? |??? 2?? |??? 2?? |??? 2?? |

? 6??? |??? 2?? |??? 2?? |??? 2?? |??? 2?? |??? 2?? |??? 1?? |

————————————————————————————————

??????? 要求结果如下:

??????? —————————

ROW_ID | COUNT? |

? 1??? |??? 3?? |?

? 2??? |??? 2?? |

? 3??? |??? 2?? |

? 4??? |??? 1?? |

? 5??? |??? 1?? |

? 6??? |??? 1?? |

SELECT ROW_ID,(6-(CASE WHEN COL1=2 THEN COL1 / 2 ELSE 0 END)

-(CASE WHEN COL2=2 THEN COL2 / 2 ELSE 0 END)

-(CASE WHEN COL3=2 THEN COL3 / 2 ELSE 0 END)

-(CASE WHEN COL4=2 THEN COL4 / 2 ELSE 0 END)

-(CASE WHEN COL5=2 THEN COL5 / 2 ELSE 0 END)

-(CASE WHEN COL6=2 THEN COL6 / 2 ELSE 0 END))AS COUNT FROM TABLE_A?

?

8、有一客户表,数据如下:

客户???? 日期????????? 资金

F001??? 2003-03-05???? 123.00

F002??? 2003-03-04???? 1223.00

F002??? 2003-03-02???? 1123.00

F003??? 2003-03-05???? 1231.00

F003??? 2003-03-04???? 1232.00

要求选出每个客户最新的哪条记录 组成一个结果集,结果如下:

F001??? 2003-03-05???? 123.00

F002??? 2003-03-04???? 1223.00

F003??? 2003-03-05???? 1231.00

?

SELECT A.客户, B.日期, A.资金 FROM? 客户资金表 A,

??? (SELECT 客户, MAX(日期) 日期? FROM 客户资金表? GROUP BY 客户 ) B

WHERE A.客户 = B.客户 AND A.日期 = B.日期

?

9、用游标将根据sys_orgmenber表中的member字段为依据将org字段更新到sys_user 表中username对应的reg_num字段信息

?

?

10、下表,记录数据较多,要求对同一分类的数据进行排序?

CREATE TABLE A_TEST(工號VARCHAR(10), 姓名 varchar(10), 時間VARCHAR(20), 序號INT)

INSERT INTO A_TEST VALUES('001',' abc ',’17:40’,0)

INSERT INTO A_TEST VALUES('001','abc',’08:00’,0)

INSERT INTO A_TEST VALUES('001',' abc ',’13:28’,0)

INSERT INTO A_TEST VALUES('001',' abc ',’12:01’,0)

INSERT INTO A_TEST VALUES('002','def',’07:30’,0)

INSERT INTO A_TEST VALUES('002','def',’22:59’,0)

?

结果

工號 ?姓名? 時間???? 序號

001?? abc?? 08:00???? 1

001?? abc?? 12:01???? 2

001?? abc?? 13:28???? 3

001?? abc?? 17:40???? 4

002?? def??? 07:30??? 1

002?? def??? 22:59??? 2

?

UPDATE A_TEST SET ORD=(

SELECT COUNT(*)+1 FROM A_TEST B WHERE B.SJ<A_TEST.SJ AND B.ID=A_TEST.ID)

?

11、学生关系:SSnoSnameSsexSageclass??

? Sno-学号,class-班级,Sname-姓名,Ssex-性别,Sage-年龄??

? 问题:列出至少有12名男生的班号。

Select?? Class????

? FROM?? S??

? GROUP?? BY?? class,Ssex??

? HAVING?? (COUNT(Class)>=12)?? AND?? (Ssex='')

?

12、计算一个月第一天的SQL 脚本,周(wk)的时间间隔来计算哪一天是本周的星期一,用年(yy)的时间间隔来显示这一年的第一天,季度的第一天

select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

?

13、原纪录:

??? 11?????? AA,BB,CC,DD

想变成

??? 11???? AA

??? 11???? BB

??? 11???? CC

??? 11???? DD

怎么写语句?

?

create table tb其不意(id int,name varchar(500))

insert tb其不意 values(11,'AA,BB,CC,DD')

?

select top 500 id=identity(int,1,1) into # from syscolumns a,syscolumns b

?

select *

from

(

??? select a.id,name=substring(a.name,b.id,charindex(',',a.name+',',b.id)-b.id)

??? from tb其不意 a,# b

??? where b.id<=len(a.name) and substring(','+a.name,b.id,1)=','

) x

?

drop table tb其不意,#

  相关解决方案