Sql查询技艺实例

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)+@C

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

  SELECT @I=@I+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其不意,#