2014年5月14日 星期三

[SQL] NUFFIF + CHARINDEX

  1. -- charindex 函數
  2. SELECT *
  3.         ,CHARINDEX(season, '冬天春天夏天秋天') pos
  4.         ,ROW_NUMBER() OVER(ORDER BY season) "ex ante"
  5. FROM
  6.         (
  7.         SELECT '春天' season
  8.         UNION
  9.         SELECT '夏天'
  10.         UNION
  11.         SELECT '秋天'
  12.         UNION
  13.         SELECT '冬天'
  14.         )a
  15. ORDER BY
  16.         CHARINDEX(a.season, '春天夏天秋天冬天')
  17.  
  18. --NULLIF 函數 (EXP1, EXP2) 與EXP2比較,相同回傳NULL, 否則回傳EXP1
  19. SELECT 100*1/ NULLIF(VAL, 0) "RATIO"
  20.         ,CASE WHEN VAL=0 THEN NULL
  21.                 ELSE CAST( 100.0*1/VAL AS INT) END "ratio2"
  22. FROM
  23.         (
  24.         SELECT 0 val
  25.         UNION ALL
  26.         SELECT 2 val
  27.         )a

2014年5月13日 星期二

[SQL] order by case 排序

  1. --生成OrderTest
  2. DROP TABLE OrderTest
  3. WITH TEST(N, VAL)
  4. AS
  5. (
  6.         SELECT 1 N
  7.                 ,CAST('A' AS VARCHAR) VAL
  8.         UNION ALL
  9.         SELECT N+1
  10.                 ,CAST(SUBSTRING('ABCDE', N+1, 1) AS VARCHAR)
  11.         FROM TEST
  12.         WHERE N<5
  13. )
  14. SELECT * INTO OrderTest
  15. FROM TEST

  16. --排序12354
  17. SELECT N
  18. FROM OrderTest
  19. ORDER BY --越小越前面
  20.         --區域前 (123)(45)
  21.         CASE WHEN n>3 THEN 1 ELSE 0 END
  22.         --區預後 (123)(54)
  23.         CASE WHEN n>3 THEN 0-N ELSE N END
  24. --CBADE
  25. SELECT val
  26. FROM OrderTest
  27. ORDER BY
  28.         --分類(abc)(de)
  29.         CASE WHEN n>3 THEN 1 ELSE 0 END        
  30.         --到轉(cba)(de)
  31.         ,CASE WHEN n<4 THEN 0-N ELSE N END
  32.        
  33. --cbade
  34. SELECT val
  35. FROM OrderTest
  36. ORDER BY
  37.         --分兩類
  38.         --case when val in ('D','E') THEN 1 ELSE 0 END
  39.         --排序
  40.         CASE WHEN val < 'D' THEN
  41.                 ROW_NUMBER() OVER(ORDER BY val DESC)
  42.                 ELSE ROW_NUMBER() OVER(ORDER BY val ASC) END

[SQL] CASE WHEN

  1. --case 範例 表達式只有一組
  2. SELECT
  3.         CASE Cust_Name
  4.                 WHEN '張先生' THEN 1
  5.                 WHEN '曹先生' THEN 2
  6.                 ELSE 3
  7.         END UseNo
  8. FROM Orders
  9.  
  10. SELECT
  11.         CASE SUBSTRING(emp_id, 2, 1)
  12.                 WHEN '1' THEN '男'
  13.                 WHEN '2' THEN '女'
  14.                 ELSE 'unknow'
  15.         END Sex
  16. FROM employee
  17.  
  18. --搜索式case子句 表達式有多組
  19. SELECT
  20.         CASE   
  21.                 WHEN cust_Name = '張先生' THEN 1
  22.                 WHEN cust_Name = '曹先生' THEN 2
  23.                 ELSE 3
  24.         END USERNO
  25.         , CASE
  26.                 WHEN CUST_NAME '%先生' THEN '男'
  27.                 ELSE '女'
  28.         END SEX
  29.         ,CASE
  30.                 WHEN QTY BETWEEN 0 AND 150 THEN 0.10
  31.                 WHEN QTY BETWEEN AND 300 THEN 0.15
  32.                 WHEN QTY > 300 THEN 0.2
  33.         END DISCOUNT
  34. FROM ORDERS

[SQL] 集合

  1. --union 有排序效果、並且合併既有數據
  2. SELECT 'b' AS col
  3. UNION
  4. SELECT 'a' AS ccc
  5. UNION
  6. SELECT 'b' AS RESULT
  7.  
  8. --union all 無排序效果
  9. SELECT 'b' AS col
  10. UNION ALL
  11. SELECT 'a' AS ccc
  12. UNION ALL
  13. SELECT 'b' AS RESULT
  14.  
  15. --intersect 交集
  16. --except 差集
  17. SELECT N
  18. FROM a
  19. INTERSECT
  20. SELECT N
  21. FROM b