2015-11-19 23 views
0

我有以下查詢。只有一次或多次出現使用內部連接的記錄

select 
dsccnf.Id cnfRptClmId,dsccnf.tblRptcatId cnfRptcatId,dsccnf.Category cnfCategory, 
dsccnf.ClmNumber cnfNumber,dsccnf.State cnfState 
from tblClmPeriod dcp 
inner join tblRptClm dsccnf on dsccnf.tblClmPeriodId = dcp.Id and dsccnf.State=3 --and dsccnf.tblClmPeriodId = 10288 

|cnfRptClmId|cnfRptcatId|cnfCategory|cnfNumber|cnfState 
|21341  |1650  |L2   |A  | 3 
|21343  |1652  |L2   |A  | 3 
|21345  |1657  |T1   |A  | 3 
|21347  |1660  |T2   |B  | 3 
|21356  |1670  |T1   |A  | 3 

獲取以上數據,現在我只是想獲得的所有項目(cnfRptClmId,cnfCategory | cnfNumber | cnfState) 一)一類或單一類型的分類加ClmNumber列(T2 | B),即(| 21347 | 1660 | T2 | b | 3)和類似的記錄

b)中的所有記錄中出現的唯一的兩倍,而忽略其餘即

|21341|1650|L2|A|3 
|21343|1652|L2|A|3 
|21345|1657|T1|A|3 
|21356|1670|T1|A|3 

我可以得到兩種單獨的查詢爲這兩個結果。預先感謝。

+0

這裏是一個偉大的地方開始。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

回答

1
SELECT * 
FROM 
(
    SELECT 
     dsccnf.Id cnfRptClmId, 
     dsccnf.tblRptcatId cnfRptcatId, 
     dsccnf.Category cnfCategory, 
     dsccnf.ClmNumber cnfNumber, 
     dsccnf.State cnfState, 
     COUNT(dsccnf.Category) OVER (PARTITION BY dsccnf.Category) categoryCount 
    FROM 
     tblClmPeriod dcp 
     INNER JOIN tblRptClm dsccnf ON dsccnf.tblClmPeriodId = dcp.Id 
             AND dsccnf.State = 3 
) 
WHERE categoryCount = 2 

COUNT(dsccnf.Category) OVER (PARTITION BY dsccnf.Category)會給你爲dsccnf.Category上每一行的數量,所以你只是包裝在一個子查詢並僅選擇有基於下面的評論類別數= 2

的記錄。 。您可以爲dsccnf.Category和dsccnf.ClmNumber添加另一個計數,然後檢查該計數是否要過濾它。

SELECT * 
FROM 
(
    SELECT 
     dsccnf.Id cnfRptClmId, 
     dsccnf.tblRptcatId cnfRptcatId, 
     dsccnf.Category cnfCategory, 
     dsccnf.ClmNumber cnfNumber, 
     dsccnf.State cnfState, 
     COUNT(dsccnf.Category) OVER (PARTITION BY dsccnf.Category) categoryCount, 
     COUNT(dsccnf.Category) OVER (PARTITION BY dsccnf.Category, dsccnf.ClmNumber) categoryClmCount 
    FROM 
     tblClmPeriod dcp 
     INNER JOIN tblRptClm dsccnf ON dsccnf.tblClmPeriodId = dcp.Id 
             AND dsccnf.State = 3 
) 
WHERE categoryCount = 2 -- where category appears twice 
     OR categoryClmCount = 1 -- where category/clm appear only once 
+0

我們如何才能做到這一點類別加ClmNumber請任何想法 – afr0

+1

PARTITION BY確定如何計算COUNT ..如果您想要計數dsccnf.Category,dsccnf.ClmNumber組合然後使用COUNT(dsccnf.Category)OVER(PARTITION BY dsccnf.Category,dsccnf.ClmNumber)' – JamieD77

+0

這似乎工作,非常感謝它。 – afr0

0

試試這個:

select 
    dsccnf.Id   cnfRptClmId, 
    dsccnf.tblRptcatId cnfRptcatId, 
    dsccnf.Category cnfCategory, 
    dsccnf.ClmNumber cnfNumber, 
    dsccnf.State  cnfState 
from tblClmPeriod dcp 
inner join tblRptClm dsccnf on dsccnf.tblClmPeriodId = dcp.Id 
          and dsccnf.State=3 
group by 
    dsccnf.Id, 
    dsccnf.tblRptcatId, 
    dsccnf.Category, 
    dsccnf.ClmNumber, 
    dsccnf.State 
having count(*) = 2 
+0

這似乎是最簡單的,但我無法真正運行它。我嘗試更改列並得到這些錯誤消息。 列'dsccnf.Id'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – afr0

+1

@ afr0:SELECT和GROUP BY子句中的列表必須相同(除了省略GROUP BY中的別名)。 –

相關問題