2017-02-13 49 views
0

我必須加入一打表才能獲取SSRS報告所需的特定字段。其中一個必要的表連接也添加了「重複」記錄。需要COUNT的協助,獲得意想不到的結果

就數據庫而言,記錄當然並不重複,因爲有一個字段使得它們是唯一的。所以我創建了一個關閉我的主要查詢tmp表,並沒有包含那個邪惡的領域(我會配音列D) - 這個查詢有我結。

我相信這會讓我的任務變得簡單。

我的臨時表,現在只能有如下(匿名):

SELECT DISTINCT 
    jt.A      [ColumnA] 
    ,jt.B      [ColumnB] 
    ,jt.C      [ColumnC] 
    ,COUNT(*)     [TotalCount] 
INTO 
    #CountsTbl 
FROM 
    #JoinsTbl jt  
GROUP BY 
    jt.A  
    ,jt.B       
    ,jt.C 

當我加入這個表與另一個查看結果伯爵仍然是錯誤的,在一個相同的數據的任何記錄, B,C即使列D不包含在tmp表中也是重複的,我使用了SELECT DISTINCT。

+---------+------------+------------+---------+------------+ 
| ColumnA | ColumnB | ColumnC | ColumnD | TotalCount | 
+---------+------------+------------+---------+------------+ 
|| 01/01/2016 | 01/31/2016 | ABC |  1  | 
+---------+------------+------------+---------+------------+ 
|| 02/01/2016 | 02/28/2016 | ABC |  2  | 
+---------+------------+------------+---------+------------+ 
|| 02/01/2016 | 02/28/2016 | XYZ |  2  | 
+---------+------------+------------+---------+------------+ 

我缺少的是逃避我,我一直在這個查詢的邏輯這麼久,我想我需要一些其他的眼光來看待它。在上面的例子中,這是我加入時得到的,即使COUNT已經在前面的tmp表中完成了。第一行有一個正確的計數,第二個和第三個我只想計數爲1,因爲我不想讓COUNT查看D列,只是A-C。

我使用SQL Server 2014

這是我的第一篇文章,所以請讓我知道如果我需要包括更多的信息。我找不到有意義的答案 - 也許我在問錯誤的問題。

感謝

+0

因此,我看到一個基於列A,B和C的「group by」。在A,B和C列中有兩個記錄具有相同的值。唯一的區別是在D列,但是你不想檢查那一列? –

+0

我不確定這裏的問題是什麼。我懷疑這是因爲各種表格中有多行。除非你使用count(Distinct SomeColumn),否則Distinct不會幫助你聽到。至少在我看來,我希望看到一些代表你面臨的問題的樣本數據(不是真實的信息)。 –

+0

@ErayBalkanli ColumnD是問題所在,我需要該列中的信息用於報告,但是我不想在計數時包含它。我只是希望計數基於A-C列唯一的行。 – DRT

回答

0

我知道,因爲我沒有時間去到更詳細的查詢,等等這可能不是超有幫助 - 但我沒有找到我自己的解決問題的辦法。

我的主要tmp表(我沒有在這裏發表)有許多複雜的聯接 - (需要清理以提高性能),然後再加入幾個tmp表,並將它們加入到集合中。這3個tmp表連接到我的主要查詢,以顯示我需要的SSRS報告的結果。有8個用戶參數,3個是可選的,但是報告的字段被設置並導致我大部分頭痛。

我最終做的是從第一個大的tmp表中刪除'ColumnD',並在該表上執行SELECT DISTINCT。

下一個tmp表是我在我的問題中做了一個模擬的表。在上述變更後,我能夠得到'準確的'COUNTS。我使用引號,因爲所有COUNTS都是1,因爲ColumnB和C是日期,並且它們使每行都是唯一的。不用說這是朝着正確方向邁出的一步。

我刪除了日期字段(我有他們在那裏只是爲了能夠看到我是否得到重複),並拉動2列是從2表我加入了上一個tmp表和下面的密鑰是模擬它是如何工作的:

SELECT 
    jt.FKEY1       [AccountKEY] 
    ,jt.FKEY2       [CodeKEY] 
    ,COUNT(*)       [TotalCount] 
--INTO 
-- #CountsTbl 
FROM 
    #JoinsTbl jt  
GROUP BY GROUPING SETS 
    (jt.AccountKEY) 
    ,(jt.CodeKEY) 
ORDER BY 
    jt.CodeKEY 
    ,jt.AccountKEY 

生成的tmp表有我需要的COUNT。

感謝那些提出的問題 - 尤其是感謝我閱讀研究這個查詢,以幫助

0

你在第2和第3排2號,因爲那是多少行ABC許多匿名的其他職位與價值| 02/01/2016 | 02/28/2016

爲了避免這樣的問題,你有兩個選擇:

  1. 在計數查詢包括列D,那麼你將永遠有1(除非所有4列是重複的。)
  2. 在查詢中,生成結果可以完全排除列D,或使用像MIN/MAX這樣的聚合。

順便說一句,這兩種情況可能都不正確。這取決於你想要達到的目標。

+0

我想我的困惑來自COUNT的工作方式(在後臺是整個操作的細節)。列D不在COUNT查詢中,但它在我的COUNT查詢所加入的tmp表中。然後它也出現在上面的例子中,大概在我用COUNT查詢加入之後。訣竅是從最初的tmp表中刪除ColumnD,然後執行COUNT,然後在另一個連接的稍後時間添加ColumnD。 – DRT

+0

'COUNT'正常工作。問題是「你期望什麼結果?」。 –

+0

我期望用SELECT DISTINCT計數將只看到其中一個行的值|| 02/01/2016 | 02/28/2016 |因爲我沒有在COUNT查詢中包含ColumnD。我的疑惑來自誤解COUNT的工作方式,或者誤解SELECT DISTINCT在此查詢中的工作原理。我得到了我的結果,使用不同的方法發佈的答案。我必須說,我仍然不明白我第一次嘗試出了什麼問題。 – DRT