sql復雜案例


  工作中往往會遇到非常棘手的數據查詢,運營人員不知道你的數據庫表是如何設計的,也不知道你的數據庫記錄了啥數據,他只知道自己需要看什么數據,甚至有些數據根本就不存在.

 

 

  單表查詢的難度: 一張數據庫的表table,如下圖,一個房間兩個人對局,房主houser 挑戰者challenger,只記錄了贏家winner,以及分數point

    

 

  需求,列出  玩家,今天輸的總分數,今天贏的總分數,最終輸贏的分數最終的查詢的結果是

 

 

  暫時不吐槽表的設計者,以及提出需求的運營人員. 要把這個數據查出來,得用很多sql技巧,不限於 case when ,left join ,right join,union

 

  來看一個最簡單的查詢語句:

  select /*something*/ from table  #從表中查詢某字段

 

   根據需求我們可以得出初步sql:

  select player,totallose,totalwin,(totallose+totalwin) from table  #查詢玩家輸的總數,贏得總數,最終分數,

  顯然從table不能直接找到需求的字段,而是要經過一定的邏輯處理和運算

  select player,totallose,totalwin,(totallose+totalwin) from (/*something*/)

  括號里面的(/***/)就是我們需要對數據進行一些邏輯處理

 

  第一步:查詢輸的,把輸的人查出來,以及輸的總數

  (select case when winner=houser then challenger when winner=challenger then houser else 0 end AS player, 

  sum(-point) AS lose from table group by player ) AS a

 

  第二步,左聯一下,把原本輸的人的贏得總數查出來

  LEFT JOIN (SELECT winner AS player ,sum(point) AS win group by player) AS b

  ON a.player=b.player

 

  第三步,把贏的人,和贏的總數查出來,即把剛才的左聯變成右連

  (select case when winner=houser then challenger when winner=challenger then houser else 0 end AS player, sum(-point) AS lose from table group by player ) AS a

  RIGHT JOIN (SELECT winner AS player ,sum(point) AS win group by player) AS b

  ON a.player=b.player

 

  第四步 把左聯和右連的結果再union一下

 

  回到 我們一開始的最簡單的那條查詢

  select player,totallose,totalwin,(totallose+totalwin) from (/***/)

 

  最終,我們要把 (/***/) 完成, 把第一二步查出來的結果作為數據從中查出玩家,再union一下右連接

 

SELECT

  a.player AS player , a.lose AS totallose, b.win AS totalwin, (totallose+totalwin) AS total 

FROM

  ( SELECT

    case when winner=houser then challenger when  winner=challenger then houser else 0 end AS player, sum(-point)     AS   lose 

   FROM

    table 

  GROUP BY player

  )  AS

LEFT JION

  (SELECT 

    winner AS player , sum(point) AS win 

  FROM

    table 

  GROUP BY

    player) AS b

ON

  a.player=b.player

UNION

SELECT

  a.player AS player , a.lose AS totallose, b.win AS totalwin, (totallose+totalwin) AS total 

FROM

  ( SELECT

    case when winner=houser then challenger when winner=challenger then houser else 0 end  AS player, sum(-point)     AS   lose 

   FROM

    table 

  GROUP BY player

  )  AS a 

RIGHT JION

  (SELECT 

    winner AS player ,sum(point) AS win 

  FROM

    table 

  GROUP BY

    player) AS b

ON

  a.player=b.player

ORDER BY total DESC

 

本文完......

 

地址:https://mp.weixin.qq.com/s?__biz=MzI4NTEzMjc5Mw==&mid=2650554680&idx=1&sn=4ba6ac9e6e41c17329d5944e5aaaa60d&chksm=f3f833aec48fbab8895402ba2f859064a8c71bda062769a47167360b60bdd21dea6edc8579a1#rd

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM