下面是一個例子查詢,返回指定的結果:
SELECT f.CaseId
, SUM(CASE WHEN f.FeeType = 29 THEN f.UnitCost END) AS AdminFee
, SUM(CASE WHEN f.FeeType = 1 THEN f.UnitCost END) AS SubFee
, SUM(CASE WHEN f.FeeType = 15 THEN f.UnitCost END) AS ContFee
FROM dbo.Fee f
GROUP BY f.CaseId
在這個答案的查詢做了幾個假設,其中一些很可能是錯誤的。例如,它假定dbo.Fee
表中的FeeType
列是整數數據類型。
與FLOAT數據類型進行等式比較可能會產生問題,因爲這是十進制值的近似值。
對於FeeType
列,它似乎是一個離散的整數值,我們通常使用整數數據類型,而不是IEEE FLOAT。
對於「成本」值,我們通常使用DECIMAL數據類型,或者在SQL Server中,我們可以使用MONEY數據類型,而不是IEEE FLOAT。
FLOAT類型上的平等比較可能是有問題的......唯一的好辦法是找出FLOAT近似值與整數或小數值之間的差異,並考慮它們「平等」。
這裏有一個方法做比較與FLOAT,最多允許中值0.01的區別...
SELECT f.CaseId
, SUM(CASE WHEN f.FeeType > 28.99 AND f.feeType < 29.01 THEN f.UnitCost END) AS AdminFee
, SUM(CASE WHEN f.FeeType > 0.99 AND f.feeType < 1.01 THEN f.UnitCost END) AS SubFee
, SUM(CASE WHEN f.FeeType > 14.99 AND f.feeType < 15.01 THEN f.UnitCost END) AS ContFee
FROM dbo.Fee f
GROUP BY f.CaseId
一個更好的解決將是FeeType
列的數據類型更改爲整數類型。
若要返回「AdminFee加SubFee」,只需將另一個SUM(表達式)添加到SELECT列表;如果FeeType爲29或1,則此表達式將返回UnitCost。
SELECT f.CaseId
, SUM(CASE WHEN f.FeeType > 28.99 AND f.feeType < 29.01 THEN f.UnitCost END) AS AdminFee
, SUM(CASE WHEN f.FeeType > 0.99 AND f.feeType < 1.01 THEN f.UnitCost END) AS SubFee
, SUM(CASE WHEN f.FeeType > 14.99 AND f.feeType < 15.01 THEN f.UnitCost END) AS ContFee
, SUM(CASE
WHEN (f.FeeType > 28.99 AND f.feeType < 29.01)
OR (f.FeeType > 0.99 AND f.feeType < 1.01) THEN f.UnitCost END) AS AdminPlusSub
FROM dbo.Fee f
GROUP BY f.CaseId
看起來您正在嘗試做某種關鍵點。你使用的是什麼DBMS? – 2014-09-12 14:15:45
輸入和輸出之間的關係是什麼?你實際上沒有描述你在任何地方試圖做什麼...... – 2014-09-12 14:16:11
你真的不能提出一個更好的問題標題,那麼你張貼什麼?這並不能解釋你想要做什麼。另外,你在哪裏得到名爲'AdminFee','SubFee','ContFee',我們不會猜測這些東西。如果你有一張儲存了這些名字的表格,那麼就發佈這些詳細信息。 – Taryn 2014-09-12 14:18:48