2014-09-12 31 views
-4

你好在SQL數據庫dbo.Fee我我想寫一個查詢,但似乎可以想辦法做到這一點

 
----------------------------------------- 
Id  | CaseId | FeeType | UnitCost 
----------------------------------------- 
1017796 | 2697789 |  29 |  50 
1018167 | 2697789 |  1 |  150 
1019493 | 2697789 |  15 |  30 
----------------------------------------- 

我想寫一個sql查詢,我想它顯示作爲

 
----------------------------------------- 
CaseId | AdminFee | SubFee | ContFee 
----------------------------------------- 
2697789 |  50 | 150 |  30 
----------------------------------------- 

任何幫助將正在使用的MS SQL Server,這可能是你想要wgat理解 感謝

+1

看起來您正在嘗試做某種關鍵點。你使用的是什麼DBMS? – 2014-09-12 14:15:45

+0

輸入和輸出之間的關係是什麼?你實際上沒有描述你在任何地方試圖做什麼...... – 2014-09-12 14:16:11

+0

你真的不能提出一個更好的問題標題,那麼你張貼什麼?這並不能解釋你想要做什麼。另外,你在哪裏得到名爲'AdminFee','SubFee','ContFee',我們不會猜測這些東西。如果你有一張儲存了這些名字的表格,那麼就發佈這些詳細信息。 – Taryn 2014-09-12 14:18:48

回答

3

下面是一個例子查詢,返回指定的結果:

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 
+2

請勿編輯問題以向其添加解決方案。 – Taryn 2014-09-12 14:22:14

+0

它顯示 – 2014-09-12 14:33:42

+0

@SavioDias:歡迎來到StackOverflow社區!很可能,您有我的示例查詢不滿足的其他要求。但是不要猜測這些要求是什麼(例如,額外的費用類型),對於該案例的所有UnitCost總數等。 – spencer7593 2014-09-12 14:35:37

2

假設你。

select 
    caseid, 
    max(adminfee) AS AdminFee, 
    max(subfee) as Subfee, 
    max(contfee) as ContFee 
from (
    select 
    caseid, 
    case when FeeType = 29 Then UnitCost End as AdminFee, 
    case when FeeType = 1 Then UnitCost End as SubFee, 
    case when FeeType = 15 Then UnitCost End as ContFee 
    from dbo.fee 
) a 
group by caseid 

Sample SQL Fiddle

+0

對MAX和SUM好奇嗎?大多數機構都樂意收取多項費用並加起來。否則,做得好。 – 2014-09-12 14:21:48

+0

@JonathanLeffler好點。我只是選擇max,因爲我認爲只有一種特定caseID的費用。看看spencer7593的答案,我意識到總結可能更合適,並且不需要使用max來避免空值。 – jpw 2014-09-12 14:23:26

+0

輸出顯示| 2697789 | NULL | 150 | NULL | – 2014-09-12 14:40:37

相關問題