2015-11-19 18 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中的别名)。 –

相关问题