2012-04-29 38 views
0

我有兩個沒有關係的表格,兩個表格有不同的列數,但有幾列是相同的,但保存不同的數據。我能夠創建一個函數或只有我想要的數據的視圖,但是當我嘗試通過過濾日期來計數數據時,我總是得到錯誤的計數作爲回報。讓我展示2個功能,我嘗試做解釋:如何按日期統計來自2個不同表格的數據

功能1

ID - number from 1 to 8 
data sent - YES or NO 
Date - date value 

功能2

ID - number from 1 to 8 
data sent - yes or no 
date - date value 

在運行這兩個分開,我得到的所有從表中的行一切看起來不錯。

然後我嘗試添加下面的每個函數:

select 
    count([data sent]), ID 
from function1 
Where (date between @date1 and @date2) 
group by ID 

上述聲明的偉大工程,讓我對每個功能正確的結果。

現在我想如果我想將這兩個函數加入到一個函數中並從一個頁面上的兩個函數中獲取計數。

所以我創建了以下功能:

功能3

select 
    count(Function1.[data sent]) as Expr1, 
    Function1.id, 
    count(Function2.[data sent]) as Expr2, 
    Function1.date 
from 
    Function1 
LEFT OUTER JOIN 
    Function2 on Function1.id = Function2.id 
Where 
    (Function1.date between @date1 and @date2) 
group by 
    Function1.id 

在運行上面,我得到如下表:

ID Expr1 Expr2 

在這兩個表達式1和表達式2,我得到我不確定它們來自哪裏。我想有些東西會乘以100000,因爲一張桌子擁有近15000行,另一個桌子約有5000行。

我首先想知道的是,如果可能的話,可以根據日期進行過濾並同時對兩個表中的記錄進行計數。如果有人需要更多信息,請讓我知道,我會很高興分享和解釋更多。

謝謝

+0

你已經提到表之間沒有關係,那麼在'id'字段上的連接是什麼? – mohsensajjadi

回答

0

LEFT OUTER JOIN走的是左表的每一行,與同id領域找出所有在右表中的行,並在結果表中創建多行。由於id不是我們通常認爲的身份領域(它看起來更像是一個「deviceId」或其他東西),所以每個人都會得到很多匹配。重複15000次,你會發生組合爆炸。

提示:要調試這樣的事情,您可以創建包含實際數據的一小部分的示例表,並在每個表中運行10行,然後在其上運行查詢。你會立即看到問題。

可以按日期過濾。如果沒有更好的理解你的短語,我很難推薦一個實際的解決方案「我想將這兩個功能添加到一個,並從一個頁面的兩個功能中獲得計數」。

+0

好的,讓我試着重新編寫它 – EZ2010

+0

好吧,讓我試着重新表述它 - 每個功能都有一個輸出,我想從funcation1輸出resualt,並從funcation2輸出resualt,並將它們放到一個表中,並按日期過濾在兩個日期之間的字段並計算在數據發送字段中有多少是或否。你對id域的權利,它不是身份領域,讓我們把它想象成一個文本字段。我知道我的問題在哪裏,當我計算並按日期過濾時,它會從兩個記錄中重新記錄,但日期未在funcation2上過濾,只輸出具有相同id字段的任何行。 – EZ2010

0

爲什麼不能爲每個函數創建一個臨時表然後將它們連接在一起?

+0

我嘗試做到這一點 - 同樣的resualt。 – EZ2010

+0

我沒有任何具有相同數據的唯一字段,因此我嘗試進行的任何聯合只是不能正確完成。我嘗試創建兩個功能的視圖,而不過濾它,它將所有的數據,但當我嘗試創建一個新的功能來過濾視圖,它返回相同的resualt,因爲我有每個coulmn的2個字段,並沒有這些字段匹配彼此。 – EZ2010

+0

fun1Sent fun1id fun1date \t \t fun2id fun2sent fun2date 擴展7 2007年2月19日\t \t 5接通時間\t 2009/12/1 擴展7 2007年2月19日\t \t 5 12/30/2009 \t擴展 7 2007年2月19日\t \t 5接通時間\t 11/16/2010 擴展7 2007年2月19日\t \t 5接通時間\t 9/3/2011 擴展7 2007年2月19日\t \t 5接通時間\t 3/12/2012 Extended 7 2/19/2007 準時\t 3/1/2010這是兩個函數輸出到前10行 – EZ2010

0

也許子查詢可以幫助你實現你想要的:

SELECT 
    ID = COALESCE(f1.ID, f2.ID), 
    Date = COALESCE(f1.Date, f2.Date), 
    f1.Expr1, 
    f2.Expr2 
FROM (
    SELECT 
    ID, 
    Date, 
    Expr1 = COUNT([data sent]) 
    FROM Function1 
    WHERE Date BETWEEN @date1 AND @date2 
    GROUP BY 
    ID, 
    Date 
) f1 
FULL JOIN (
    SELECT 
    ID, 
    Date, 
    Expr2 = COUNT([data sent]) 
    FROM Function2 
    WHERE Date BETWEEN @date1 AND @date2 
    GROUP BY 
    ID, 
    Date 
) f2 
ON f1.ID = f2.ID AND f1.Date = f2.Date 

此查詢還採用全(外)加入,而不是左連接,以案例的加盟右側包含有不匹配的行在左邊(你想要那些行)。

+0

感謝它看起來像我所尋找的,我會嘗試它,看看它是否工作。再次感謝。 – EZ2010

+0

好的,我收到一些錯誤信息,如果你能告訴我爲什麼我會Appreacite它。首先,我想問你是否用f1和f2表示funcation1和funcation2?如果是,我會得到以下錯誤 - Msg 102,Level 15,State 1,Line 16 「。」附近的語法錯誤。謝謝 – EZ2010

+0

'f1'和'f2'是在它們之前的子查詢的別名(來自'Function1'的子查詢'f1'和來自'Function2'的子查詢的'f2')。我的測試沒有得到任何錯誤,對不起。你可能試着找出並告訴我錯誤發生在哪裏?在這個查詢中有很多'.'s。 –

相關問題