2012-12-25 29 views
1

我想創建一個特定的表,但某些數值在結果中翻倍或翻倍。 這裏的情況是:sql server服務器結果的兩倍和三倍

2表:付款和費用

[Payments]: ID, studentID, Amount, DOP (a row in this table is a payment which a student pays it on DOP (date). 
[Expenses]: ID, AmountPaid, TimeStamp (a row in this table is an expense bought such as papers or pens... on a specific date(timestamp) 

我的查詢是:

select 
sum(purchases.amount) as 'Income From Students', 
sum(Expenses.amountpaid) as 'Expenses', 
sum(purchases.amount-expenses.amountpaid) as 'Net Profit', 
datename(month,timestamp) as 'Month', 
datepart(year,timestamp) as 'Year' 
from expenses,purchases 
group by datename(month,timestamp),datepart(year,timestamp) 

爲查詢講述:我的表應該顯示每月和每年的付款總額,費用和淨額profit=payments - expenses

問題是,當得到結果時,sum(expenses.amountpaid)總是加倍。

所以有什麼想法...

+0

有表之間沒有關係?例如給予兩排費用(2012年1月)(2012年2月)加入4行支付將導致8行查看(從支出,購買) – bummi

+0

它們之間沒有關係 –

+0

如果尼克不對(我認爲他應該),那麼沒有改變設計就沒有解決問題的辦法。 – bummi

回答

0

我解決了這傢伙,4個小時,試圖後,查詢是:

select sum(P.Income) as 'Income from Payments', 
sum(E.expense) as 'Expenses', 
sum(P.Income)-sum(E.expense) as 'Net Profit', 
DateName(month , DateAdd(month , IncomeMonth , 0) - 1) as 'Month' 
from 
(select sum(payments.amountpaid) as Income, 
month(DOP) as IncomeMonth 
from payments group by month(dop)) as P, 
(select sum(expenses.amountpaid) as Expense, 
month(timestamp) as ExpenseMonth 
from expenses 
group by month(timestamp)) 
as E 
where 
E.Expensemonth=P.IncomeMonth 
group by P.IncomeMonth 
3

聽起來像你需要指定兩個表之間的關係。

這樣的事情,我認爲:

select 
sum(purchases.amount) as 'Income From Students', 
sum(Expenses.amountpaid) as 'Expenses', 
sum(purchases.amount-expenses.amountpaid) as 'Net Profit', 
datename(month,timestamp) as 'Month', 
datepart(year,timestamp) as 'Year' 
from expenses,purchases 
WHERE PURCHASES.DOP = EXPENSES.TIMESTAMP /*Add this*/ 
group by datename(month,timestamp),datepart(year,timestamp) 
+0

沒有關係,只需要在每個月內計算所有采購和費用,然後從每個月獲得(採購費用) –

+0

儘管...月份和年份有關係必須將每個月的購買量分別與每個月的費用相關聯 - 否則,您無法按月正確分解數據。 – 2012-12-25 18:31:34

+0

我已經明白了,我會嘗試 –

0
SELECT T.INCOME,T.EXPENSE,SUM(T.INCOME)-SUM(T.EXPENSE) AS PROFIT 
FROM (SELECT SUM(P.amount) AS Income, SUM(E.amountpaid) AS Expense 
FROM Payments P,Expenses E WHERE P.ID=E.ID 
GROUP BY datename(month, timestamp), datepart(year, timestamp)) AS T; 
+0

列'T.Income'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句。 –

+0

其中P.ID = E.ID是不必要的,因爲不需要在兩個表之間關聯 –

+0

@AliMkahal'WHERE P.ID = E.ID不是不必要的'夥計,這是您獲得雙重價值的唯一原因。如果你不使用它,它會添加冗餘值。得到它了 ?? – Ravi