t-sql 筆記(2)

1.用標點符號分隔的字符串,轉換成表

--    SELECT * FROM dbo.split('581:579:519:279:406:361:560',':')
CREATE FUNCTION [dbo].[Split] (@Sql VARCHAR (8000), @Splits VARCHAR (10))
   RETURNS @temp TABLE (a VARCHAR (100))
AS
   BEGIN
      DECLARE @i   INT
      SET @Sql = RTrim (LTrim (@Sql))
      SET @i = CharIndex (@Splits, @Sql)

      WHILE @i >= 1
      BEGIN
         INSERT @temp
         VALUES (Left (@Sql, @i - 1))

         SET @Sql = SubString (@Sql, @i + 1, Len (@Sql) - @i)
         SET @i = CharIndex (@Splits, @Sql)
      END

      IF @Sql <> ''
         INSERT @temp
         VALUES (@Sql)

      RETURN
   END

 http://www.cnblogs.com/fang-beny/archive/2013/08/13/3255171.htmlhtml

2.使用 APPLY

http://technet.microsoft.com/zh-cn/library/ms175156%28v=sql.90%29.aspxsql

使用 APPLY 運算符能夠爲實現查詢操做的外部表表達式返回的每一個行調用表值函數。表值函數做爲右輸入,外部表表達式做爲左輸入。經過對右輸入求值來得到左輸入每一行的 計算結果,生成的行被組合起來做爲最終輸出。APPLY 運算符生成的列的列表是左輸入中的列集,後跟右輸入返回的列的列表。app

APPLY 有兩種形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 僅返回外部表中經過表值函數生成結果集的行。OUTER APPLY 既返回生成結果集的行,也返回不生成結果集的行,其中表值函數生成的列中的值爲 NULL。ide

CREATE TABLE Employees
(
  empid   int         NOT NULL,
  mgrid   int         NULL,
  empname varchar(25) NOT NULL,
  salary  money       NOT NULL,
  CONSTRAINT PK_Employees PRIMARY KEY(empid),
)
CREATE TABLE Departments
(
  deptid    INT NOT NULL PRIMARY KEY,
  deptname  VARCHAR(25) NOT NULL,
  deptmgrid INT NULL REFERENCES Employees
)
CREATE FUNCTION dbo.fn_getsubtree(@empid AS INT) RETURNS @TREE TABLE
(
  empid   INT NOT NULL,
  empname VARCHAR(25) NOT NULL,
  mgrid   INT NULL,
  lvl     INT NOT NULL
)
AS
BEGIN
  WITH Employees_Subtree(empid, empname, mgrid, lvl)
  AS
  ( 
    -- Anchor Member (AM)
    SELECT empid, empname, mgrid, 0
    FROM Employees
    WHERE empid = @empid

    UNION all
    
    -- Recursive Member (RM)
    SELECT e.empid, e.empname, e.mgrid, es.lvl+1
    FROM Employees AS e
      JOIN Employees_Subtree AS es
        ON e.mgrid = es.empid
  )
  INSERT INTO @TREE
    SELECT * FROM Employees_Subtree

  RETURN
END
GO
SELECT *
FROM Departments AS D
  CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST
使用 APPLY

 

if object_id('tempdb..#CategoryDetail') is not null
        drop table #CategoryDetail  
create  TABLE  #CategoryDetail (
    [Id] [int],
    [CategoryId] [int],
    [Cry] [varchar](50))
INSERT into #CategoryDetail ([Id], [CategoryId], [Cry]) VALUES (1, 1, N'')
INSERT into #CategoryDetail ([Id], [CategoryId], [Cry]) VALUES (2, 2, N'')
select * from #CategoryDetail;
if object_id('tempdb..#Category') is not null
        drop table #Category  
create  TABLE #Category (
    [Id] [int],
    [Name] [varchar](50))
INSERT into #Category ([Id], [Name]) VALUES (1, N'Cat')
INSERT into #Category ([Id], [Name]) VALUES (2, N'Dog')
INSERT into #Category ([Id], [Name]) VALUES (3, N'Tiger')
select * from #Category;
select * from #Category a cross apply (select * from #CategoryDetail b where b.CategoryId=a.Id) c
select * from #Category a outer apply (select * from #CategoryDetail b where b.CategoryId=a.Id) c

 

http://www.cnblogs.com/A2008A/archive/2011/03/11/1981828.html 函數

 

3.行轉列

 http://www.cnblogs.com/lwhkdash/archive/2012/06/26/2562979.htmlspa

WEEK           INCOME
星期一           1000
星期二           2000
星期三           3000
星期四           4000
星期五           5000
星期六           6000
星期日           7000code

 

星期一   星期二   星期三   星期四   星期五   星期六   星期日
1000     2000     3000     4000     5000     6000     7000htm

SELECT  
SUM(CASE WEEK WHEN '星期一' THEN INCOME END) AS [星期一],
SUM(CASE WEEK WHEN '星期二' THEN INCOME END) AS [星期二],
SUM(CASE WEEK WHEN '星期三' THEN INCOME END) AS [星期三],
SUM(CASE WEEK WHEN '星期四' THEN INCOME END) AS [星期四],
SUM(CASE WEEK WHEN '星期五' THEN INCOME END) AS [星期五],
SUM(CASE WEEK WHEN '星期六' THEN INCOME END) AS [星期六],
SUM(CASE WEEK WHEN '星期日' THEN INCOME END) AS [星期日]
FROM WEEK_INCOME



SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]
FROM WEEK_INCOME
PIVOT
(
    SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])
)TBL

 4.order by case

DECLARE @t1 TABLE 
( 
c1 INT, 
c2 INT 
); 

 

SELECT c1, c2
  FROM @t1
ORDER BY CASE WHEN c1 >= 3 THEN 1 ELSE 2 END,
         CASE WHEN c2 <= 3 THEN 1 ELSE 2 END

 

c1 c2 c1排序 c2排序
4 1 1 1
4 2 1 1
3 6 1 2
3 5 1 2
1 3 2 1
1 2 2 1
2 2 2 1
2 1 2 1
1 4 2 2

 

 

 

x.待續blog

相關文章
相關標籤/搜索