2012-01-05 83 views
1

下面的過程是這樣的問題:SQL查詢幫助 - 建築和計算

我有2個表,包括基本數據之一,一個包含相關基礎數據的數據只有一個值,因此:

TABLE1 pKey | category1 | category2 | ..3 |etc

TABLE2 pKey | value1 |

哪裏pKey是唯一的每個真實世界的物體,對於爲例序列號即

現在,我該如何比較表格以便將值與另一個表格中的對象相匹配,以便將對象的值添加到對象的「所有者」中?

場景:

OBJ1是一個人擁有很多的球隊之一,在每月結束時,我們得到的報告中指出的費用/銷售等所有的特許經營權和的其全體業主品牌,並必須計算這個特定的所有者如何做。所以我們比較表2至表1,讓主人在一天的末尾添加了「淨利益」爲這個特殊的專營權,他的競選總希望看起來像數據:

表3 owner | Total Earnings |

我寫了一個查詢,它比較: SELECT * FROM Table1 INNER JOIN Table2 WHERE Table1.pkey = Table2.pKey

唯一的問題是,在本身,是不是非常有用的。那麼,下面的過程中這樣做,不考慮語法錯誤的道路,我忘記按shift所有的時間:通過表1

SELECT DISTINCT(Owner) FROM TABLE1

然後依次爲每一位業主得到他的所有pKeys

SELECT pKey FROM Table1 Where Owner = ownerResult.Owner

然後將結果從比較TABLE2獲得價值

SELECT Value FROM TABLE2 INNER JOIN TABLE1 WHERE table2.pKey = table1.pKey

然後對該結果進行添加。

此外,SQL是否處理浮點數,如果有的話,是否有任何特殊的步驟我應該採取?

+0

可以說有20個所有者,它將不得不在每個循環中通過,它很笨拙,我不喜歡它... – Dani 2012-01-05 14:42:48

回答

1

你可以做到這一切在一個聲明:

select 
    t1.Owner, 
    sum(t2.Value) as NetProfit 
from 
    Table1 t1 
    inner join Table2 t2 on 
     t1.pKey = t2.pKey 
group by 
    t1.Owner 

我們在這裏使用什麼被稱爲「集合函數」。在這種情況下,它是sum,但它可能是maxminavg或其他。此外,我們可以通過使用group by聲明來對此進行分區,即「我只希望聚合在這些列的每個不同級別上工作。」在這種情況下,owner

並回答你的最後一個問題,是的,它的確如此。doubledecimalnumeric是所有的數據類型,可以處理十進制數(也有相當多的多,太),但我需要知道你的數據庫服務器的類型(例如,MySQL和SQL服務器,Oracle)更回答吧完全。有的甚至含有moneycurrency數據類型,它可以確保你沒有局部美分,你有什麼。

+0

它是SQL Server,感謝加載快速答案btw,我會在一秒鐘內測試它。 – Dani 2012-01-05 14:47:18

+0

@Dani - 如果它的SQL服務器,然後點擊這裏:http://msdn.microsoft.com/en-us/library/ff848794.aspx這些都是可用的數字數據類型。你會想看看這個用例的「金錢」。 – Eric 2012-01-05 14:48:57

0

假設你希望所有的值從表2的總和:

Select t1.pkey, sum(t2.value) 
from table1 t1 
inner join table2 t2 on t1.pkey = t2.pkey 
group by t1.pkey 

這會從表1只返回的行與表2中至少一個匹配行;如果你想要的所有行從表1,使用外連接來代替:

Select t1.pkey, sum(t2.value) 
from table1 t1 
left outer join table2 t2 on t1.pkey = t2.pkey 
group by t1.pkey 

一個有關此言浮點值在SQL:如果你要處理的貨幣金額,不要使用浮點運算FOR THIS;改爲使用定點表示。 否則,你會碰到舍入誤差。