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