查询以排除否定值对

时间:2018-02-19 15:48:07

标签: sql sql-server

创建表#Temp(Number Varchar(20),Category Varchar(20))

Insert Into #Temp 
Select '123', '-A'
Union all
Select '123', 'A'
Union all
Select '123', 'A'
Union all
Select '123','B'
Union all
Select '123','-B' 

Select * From  #temp  

result set
---------------------------
Number  Category
123      -A
123       A
123       A
123       B
123      -B
123       C
123      -C
123      -C
---------------------------

从上面的数据集中,我需要查询当有2-A和A时只显示一个A.

我需要的是从上面的例子中得到一个取消-A和A的输出,

查询应仅返回以下内容

result set
---------------------------
Number  Category 
123      A 
123     -C
---------------------------

2 个答案:

答案 0 :(得分:2)

这应该做你想要的:

select t.*
from (select t.*,
             count(*) over (partition by replace(category, '-', ''), seqnum) as cnt_sc
      from (select t.*,
                   row_number() over (partition by category order by category) as seqnum
            from temp t
           ) t
     ) t
where cnt_sc = 1;

对于给定的类别,这枚举了行。然后计算每个枚举的数量,并考虑“ - ”。它返回只有一个枚举的行 - 它们没有匹配。

注意:这假设category除了开头时没有连字符。

编辑:

如果您知道最多只有一行,您可以这样做:

select number,
       (case when count(*) > sum(case when category like '-%' then 1 else 0)
             then '-' + replace(category, '-', '')
             else replace(category, '-', '')
        end)
from t
group by number, replace(category, '-', '')
having count(*) <> 2 * sum(case when category like '-%' then 1 else 0 end)

答案 1 :(得分:0)

不是最漂亮的解决方案,但也许其他人有更优雅的方法:

WITH cte as(
            SELECT 
                SUM(CASE WHEN LEFT(Category, 1) = '-' 
                         THEN -1
                         ELSE 1 
                         END) as summed
                , Right(Category,1) AS nuCat
            FROM #Temp
            GROUP BY Number, RIGHT(Category, 1)
            )

SELECT CASE WHEN SUM(summed) > 0 
             THEN nuCat
             ELSE '-' + nuCat 
             END AS DerivedCategory  
FROM cte
GROUP BY nuCat
HAVING SUM(summed) <> 0

使用CTE将字符串转换为整数SUM。然后,当从CTE中选择时,字符串与整数&#34;符号&#34;串联。来自CTE的总和值。

结果:

DerivedCategory
---------------
A
-C