使用SQL語句使數據從堅向排列轉化成橫向排列(排班表)

来源:http://www.cnblogs.com/KLLQBKY/archive/2017/06/09/6973139.html
-Advertisement-
Play Games

知識重點: 1.extract(day from schedule01::timestamp)=13 Extract 屬於 SQL 的 DML(即資料庫管理語言)函數,同樣,InterBase 也支持 Extract,它主要用於從一個日期或時間型的欄位內抽取年、月、日、時、分、秒數據,因此,它支持其 ...


知識重點:

1.extract(day from schedule01::timestamp)=13

Extract 屬於 SQL 的 DML(即資料庫管理語言)函數,同樣,InterBase 也支持 Extract,它主要用於從一個日期或時間型的欄位內抽取年、月、日、時、分、秒數據,因此,它支持其關健字 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、WEEKDAY、YEARDAY。

  Extract 的使用語法為:

   EXTRACT(關健字 FROM 日期或時間型欄位)

  如:extract(year from schedule01)=2017從日期中提取年份

2.max()函數:取最大值

3.case()函數的嵌套

  註意嵌套case()函數時,每個case的開始和結束。 

 


 

排班功能:現有兩個人員(A和B),他們在不同日期的值班狀態(state)不同,現在要查詢他們在2017.6月的值班信息

表結構如下:

CREATE TABLE public.temp_schedule

(

  id integer NOT NULL DEFAULT nextval('temp_schedule_id_seq'::regclass),

  schedule01 timestamp without time zone,--日期

  schedule03 character varying(255),--姓名

  state character varying(255),--值班狀態(0休 1班)

  CONSTRAINT temp_schedule_pkey PRIMARY KEY (id)

)

1.查詢SQL語句:

select schedule03,schedule01,state  from temp_schedule

 where extract(year from schedule01)=2017 and extract(month from schedule01)=6

 order by  schedule03,schedule01;

顯示為:

 

 

2.現在需要根據(6月的)日期,從1號開始根據人員名稱橫向合併排列數據(即只顯示兩行)

顯示效果如下:

實現的SQL語句如下:

select schedule03 as name

,max(case when extract(day from schedule01::timestamp)=1 then state end) as day1

,max(case when extract(day from schedule01::timestamp)=2 then state end) as day2

,max(case when extract(day from schedule01::timestamp)=3 then state end) as day3

,max(case when extract(day from schedule01::timestamp)=4 then state end) as day4

,max(case when extract(day from schedule01::timestamp)=5 then state end) as day5

,max(case when extract(day from schedule01::timestamp)=6 then state end) as day6

,max(case when extract(day from schedule01::timestamp)=7 then state end) as day7

,max(case when extract(day from schedule01::timestamp)=8 then state end) as day8

,max(case when extract(day from schedule01::timestamp)=9 then state end) as day9

,max(case when extract(day from schedule01::timestamp)=10 then state end) as day10

,max(case when extract(day from schedule01::timestamp)=11 then state end) as day11

,max(case when extract(day from schedule01::timestamp)=12 then state end) as day12

,max(case when extract(day from schedule01::timestamp)=13 then state end) as day13

from temp_schedule

where extract(year from schedule01)=2017 and extract(month from schedule01)=6

group by schedule03;

 

3.將人員的值班狀態通過漢字(0休 1班)顯示出來,顯示效果如下:

SQL語句(主要是實現case的嵌套):

select schedule03 as name

,max(case when extract(day from schedule01::timestamp)=1 then (case when state='0' then '休' else '班' end) end) as day1

,max(case when extract(day from schedule01::timestamp)=2 then (case when state='0' then '休' else '班' end) end) as day2

,max(case when extract(day from schedule01::timestamp)=3 then (case when state='0' then '休' else '班' end) end) as day3

,max(case when extract(day from schedule01::timestamp)=4 then (case when state='0' then '休' else '班' end) end) as day4

,max(case when extract(day from schedule01::timestamp)=5 then (case when state='0' then '休' else '班' end) end) as day5

,max(case when extract(day from schedule01::timestamp)=6 then (case when state='0' then '休' else '班' end) end) as day6

,max(case when extract(day from schedule01::timestamp)=7 then (case when state='0' then '休' else '班' end) end) as day7

,max(case when extract(day from schedule01::timestamp)=8 then (case when state='0' then '休' else '班' end) end) as day8

,max(case when extract(day from schedule01::timestamp)=9 then (case when state='0' then '休' else '班' end) end) as day9

,max(case when extract(day from schedule01::timestamp)=10 then (case when state='0' then '休' else '班' end) end) as day10

,max(case when extract(day from schedule01::timestamp)=11 then (case when state='0' then '休' else '班' end) end) as day11

,max(case when extract(day from schedule01::timestamp)=12 then (case when state='0' then '休' else '班' end) end) as day12

,max(case when extract(day from schedule01::timestamp)=13 then (case when state='0' then '休' else '班' end) end) as day13

from temp_schedule

where extract(year from schedule01)=2017 and extract(month from schedule01)=6

group by schedule03 ;

 

 


 

  知識一點點的累積,技術一點點的提高!加油!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 同Oracle一樣,SQL Server在非一致性關閉的時候也會進行實例恢復(Instance Recovery),本文根據stack overflow的文章介紹一些SQL Server實例恢復的知識。 原文鏈接:https://stackoverflow.com/questions/4193273 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6979499.html show profile 命令用於跟蹤執行過的sql語句的資源消耗信息,可以幫助查看sql語句的執行情況,可以在做性能分析或者問題診斷的時候作為參考。 在MySQL5.7中, show profile ...
  • 最大感受,無論從設計還是源碼,Redis都儘量做到簡單,其中運用到的原理也通俗易懂。特別是源碼,簡潔易讀,真正做到clean and clear, 這篇文章以unstable分支的源碼為基準,先從大體上整理Redis的對象類型以及底層編碼。 當我們在本文中提到Redis的“數據結構”,可能是在兩個不 ...
  • 1 首先需要安裝gcc,把下載(http://redis.io/download)好的redis-3.0.0-rc2.tar.gz 放到linux /usr/local文件夾下 2 進行解壓 tar -zxvf redis-3.0.0-rc2.tar.gz 3 進入到redis-3.0.0目錄下,進 ...
  • 預處理的特點:1.效率高,執行速度快 2.安全性高,可以防止sql註入 $mysqli 中的函數 $stmt=$mysqli->prepare($sql); 預備一條sql語句,接下來要執行 綁定參數 給參數賦值 $stmt ->bind_param("類型對應",參數列表); $bool= $st ...
  • 1.系統信息函數 1.會話信息函數 ...
  • 目錄 一、視圖 二、觸發器 三、函數 四、存儲過程 五、事務 一、視圖 視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,併為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,並可以將其當作表來使用。 SELECT * FROM ( SELECT nid, NAME FRO ...
  • 在資料庫伺服器異常斷電重啟後,資料庫會進行實例恢復,那麼實例恢復的過程中Oracle做了什麼操作呢?參考官網在這裡做一下解釋,菜鳥水平有限,歡迎勘正。 首先說下實例恢復的定義: Instance recovery is the process of applying records in the o ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...