小編在做組織部維護最后收尾工作的時候,遇到了這樣一個問題,需要將定性考核得分查出來、定量考核對應的數據查出來并進行得分計算、附加分查出來,最后將這三部分信息匯總之后得到總成績,如果其中一項成績沒有進行計算那么是可以得到成績的。
展望師哥他們以前的邏輯,通過兩個視圖將定性和定量得分計算保存之后,再用一個視圖將三個得分連到一起并進行計算。
被組長規定只能用SQL語句來寫,因為這樣維護起來就很方便了。
我開始先用了級聯查詢并計算,可是效果并不太理想,最后了解到連接查詢,經過反復試驗,終于有了以下成果:
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT
--總排名
ROW_NUMBER() OVER(ORDER BY ISNULL((h.AdditionalResults),0) + f.TotalScores ) AS 總排名 ,
--園區ID
f.ObjectID AS 市直單位id,
--園區名稱
f.Responsibility AS 開發區園區名稱,
--年份
f.YearTime AS 年份,
--定量總得分
f.QuantifyScores as 定量總得分,
--附加分
ISNULL((h.AdditionalResults),0) AS 獎懲總得分,
--最總定量+定性+附加總分
ISNULL((h.AdditionalResults),0) + f.TotalScores AS 總得分
from
--匯總,通過左鏈接鏈接之后,查詢下面信息,并將定性和定量總得分匯總
(SELECT
--園區ID
c.ObjectID,
--園區名稱
c.Responsibility,
--年份
e.YearTime,
--定量總得分
ISNULL((c.QuantifyScores),0) AS QuantifyScores,
--定性定量總得分
ISNULL((e.CalculateScores),0) + ISNULL((c.QuantifyScores),0) AS TotalScores
FROM
--第一層查詢,查詢到定性總得分當成基表
(SELECT
--園區ID
d.DevelopmentID,
--考核時間
d.YearTime,
--定性總得分
d.CalculateScores
FROM
T_DevelopmentScores d) e
--和第一層并列的查詢,查詢到定量信息并計算出定量總分
left JOIN
(SELECT
--園區ID
a.ObjectID,
--園區名稱
a.Responsibility,
--計算并顯示定量總得分
ISNULL(CAST(a.score AS real), 0)*ISNULL(CAST(b.Weight AS real), 0) / 100 AS QuantifyScores
FROM
T_DevelopmentQuantifyScores a,
T_DevelopmentQuantifyTarget b
WHERE a.TragetID = b.TragetID ) c ON e.DevelopmentID = c.ObjectID) f
--和定量定性得分匯總并列,通過左鏈接查詢到下面附加分
LEFT JOIN
(SELECT
--園區ID
g.DevelopmentID,
--附加分
g.AdditionalResults
FROM
T_DevelopmentAdditionalResults g) h ON f.ObjectID = h.DevelopmentID</span>
~~~
嘗到了SQL語句中連接的甜頭,于是小編在網上搜索之后并自己實踐,有了下面成果:
## 舉例介紹
下面的內容介紹將會分別用下面兩個表進行試驗

## 外連接
### 左連接(left join或者left outer join):
說明:以左表為基礎,查詢右表中所有符合條件的信息,不存在的用Null補充
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a LEFT JOIN dbo.TestTable2 b ON a.Hobbyid = b.Hobbyid</span>
~~~
結果如下:

###右連接(right join或者right outer join)
說明:以右表為基礎,查詢左表中所有符合條件的信息,不存在的用Null補充
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a right JOIN dbo.TestTable2 b ON a.Hobbyid = b.Hobbyid</span>
~~~
結果如下:

###完全連接(full join或者full outer join)
說明:將兩個表中的信息都查出來,沒有對應的信息,用Null補充
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a full JOIN dbo.TestTable2 b ON a.Hobbyid = b.Hobbyid</span>
~~~
結果如下:

## 內連接(inner join)
說明:只顯示符合條件的信息,條件可以是(=、<、>、<>、<=、>=、!<、!>),下面只介紹條件為=的內容
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a inner JOIN dbo.TestTable2 b ON a.Hobbyid = b.Hobbyid</span>
~~~
結果如下:

## 交叉連接(cross join)
###無條件
說明:將查到兩個表中的所有數據的乘積(如果每個表中都有3行數據,最后顯示3*3=9行數據)
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 cross JOIN dbo.TestTable2
--上面與下面的語句等價
SELECT * FROM dbo.Testtable1, dbo.TestTable2</span>
~~~
結果如下:

###有條件
說明:將上面查到的無條件的結果按照條件進行篩選但是這里只能用where表示不能用on表示
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a cross JOIN dbo.TestTable2 b WHERE a.Hobbyid = b.Hobbyid</span>
~~~
結果如下:

## 總結
小編將這句話送給自己以及所有的讀者:
在將來的路上,了解一塊東西就將它的來龍去脈縷個通,并進行總結,這樣以后的路將會更加通暢!