熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL高手篇:精典SQL FAQ收藏

2013-11-15 14:33:31  來源: SQL Server 

   行列轉換普通
  
  假設有張學生成績表(CJ)如下
  Name  Subject   Result
  張三  語文    
  張三  數學    
  張三  物理    
  李四  語文    
  李四  數學    
  李四  物理    
  
  想變成
  姓名  語文  數學  物理
  張三       
  李四       
  
  declare @sql varchar()
  set @sql = select Name
  select @sql = @sql + sum(case Subject when +Subject+ then Result end) [+Subject+]
  from (select distinct Subject from CJ) as a
  select @sql = @sql+ from test group by name
  exec(@sql)
  
   行列轉換合並
  
  有表A
  id pid
   
   
   
   
   
   
  如何化成表B:
  id pid
   
   
   
  
  創建一個合並的函數
  create function fmerg(@id int)
  returns varchar()
  as
  begin
  declare @str varchar()
  set @str=
  select @str=@str++cast(pid as varchar) from 表A where id=@id
  set @str=right(@strlen(@str))
  return(@str)
  End
  go
  
  調用自定義函數得到結果
  select distinct iddbofmerg(id) from 表A
  
   如何取得一個數據表的所有列名
  
  方法如下先從SYSTEMOBJECT系統表中取得數據表的SYSTEMID然後再SYSCOLUMN表中取得該數據表的所有列名
  SQL語句如下
  declare @objid int@objname char()
  set @objname = tablename
  select @objid = id from sysobjects where id = object_id(@objname)
  select Column_name = name from syscolumns where id = @objid order by colid
  
  是不是太簡單了? 呵呵 不過經常用阿
  
   通過SQL語句來更改用戶的密碼
  
  修改別人的需要sysadmin role
  EXEC sp_password NULL newpassword User
  
  如果帳號為SA執行EXEC sp_password NULL newpassword sa
  
   怎麼判斷出一個表的哪些字段不允許為空?
  
  select COLUMN_NAME from INFORMATION_SCHEMACOLUMNS where IS_NULLABLE=NO and TABLE_NAME=tablename
  
   如何在數據庫裡找到含有相同字段的表?
  
  a 查已知列名的情況
  SELECT bname as TableNameaname as columnname
  From syscolumns  a INNER JOIN  sysobjects b
  ON aid=bid
  AND btype=U
  AND aname=你的字段名字
  
  b 未知列名查所有在不同表出現過的列名
  Select oname As tablenamesname As columnname
  From syscolumns s sysobjects o
  Where sid = oid
  And otype = U
  And Exists (
  Select  From syscolumns s
  Where sname = sname
  And sid <> sid
  )
  
   查詢第xxx行數據
  
  假設id是主鍵
  select *
  from (select top xxx * from yourtable) aa
  where not exists(select  from (select top xxx * from yourtable) bb where aaid=bbid)
  
  如果使用游標也是可以的
  fetch absolute [number] from [cursor_name]
  行數為絕對行數
  
   SQL Server日期計算
  
  a 一個月的第一天
  SELECT DATEADD(mm DATEDIFF(mmgetdate()) )
  b 本周的星期一
  SELECT DATEADD(wk DATEDIFF(wkgetdate()) )
  c 一年的第一天
  SELECT DATEADD(yy DATEDIFF(yygetdate()) )
  d 季度的第一天
  SELECT DATEADD(qq DATEDIFF(qqgetdate()) )
  e 上個月的最後一天
  SELECT dateadd(msDATEADD(mm DATEDIFF(mmgetdate()) ))
  f 去年的最後一天
  SELECT dateadd(msDATEADD(yy DATEDIFF(yygetdate()) ))
  g 本月的最後一天
  SELECT dateadd(msDATEADD(mm DATEDIFF(mgetdate())+ ))
  h 本月的第一個星期一
  select DATEADD(wk DATEDIFF(wk
  dateadd(dddatepart(daygetdate())getdate())) )
  i 本年的最後一天
  SELECT dateadd(msDATEADD(yy DATEDIFF(yygetdate())+ ))
From:http://tw.wingwit.com/Article/program/SQLServer/201311/21989.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.