【问题标题】:Query to exclude negating value-pairs查询以排除否定值对
【发布时间】:2018-02-19 15:48:06
【问题描述】:

创建表#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
---------------------------

【问题讨论】:

  • 请修复您的样本数据,-C 来自哪里,B-B 发生了什么?我是否正确假设您想保留最常出现的那个?
  • 如果我理解的话,您希望字母值相互抵消吗?就像它们是整数一样,A 的“总和”是 1,B 是 0,C 是 -1?如果 B=0 则不显示?

标签: sql sql-server


【解决方案1】:

这应该做你想做的:

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)

【讨论】:

  • 这行得通。感谢您的快速回复。对此,我真的非常感激。看到代码后,我感到很愚蠢,以至于我以前无法弄清楚这一点。谢谢你的想法。
【解决方案2】:

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

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 中选择时,字符串会与 CTE 中的总和值中的整数“符号”连接起来。

结果:

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2013-04-08
    • 2021-10-29
    • 2018-04-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2022-01-26
    相关资源
    最近更新 更多