我试图找出一种方法来检查它们是否是共享行中的重复值。
示例:
HMOID Name Addon10 Addon15 Addon20
RFFF Blah img path1 img path2 img path1
对于我的例子,我想检查RFFF的任何插件是否有任何重复值。在上面的例子中,' RFFF'在Addon10和Addon20中有两个相同的图像(图像有一个路径。所以目前它们看起来像 http://oc2-reatest.regalmed.local/ocupgrade52/images/NDL_SCAN_SR.PNG)。
我希望能够为多行执行此操作。我认为以下内容会让我知道如何开始:
select * from HlthPlan
Group By HMO1A, HMONM
Having COUNT(*) > 1
然而,它通过以下错误:
Msg 8120,Level 16,State 1,Line 1
专栏' HlthPlan.HMOID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。*
我对SQL很新,任何建议都会受到赞赏。
答案 0 :(得分:1)
不要为您的选择查询添加*。仅包括您在GROUP BY中使用的列
SELECT HMO1A, HMONM, COUNT(*) from HlthPlan
GROUP BY HMO1A, HMONM
HAVING COUNT(*) > 1;
答案 1 :(得分:0)
只需要检查三列,假设一行中有非空值:
select * from HlthPlan
where Addon10 in (Addon15, Addon20) or Addon15 = Addon20
您还可以使用cross apply
来旋转分组值:
select HMOID, addon
from HlthPlan cross apply (
select addon
from (values (Addon01), (Addon02), (Addon03), ... (Addon20)) as pvt(addon)
) a
where addon is not null
group by HMOID, addon
having count(*) > 1;
http://rextester.com/QWIW87618
每个HMOID
都会有多行,其中不同的列组具有相同的值。顺便说一下,报告所涉及的特定列的名称会给查询增加另一个难度。
答案 2 :(得分:0)
您可以通过UNPIVOT
比较结果来检查这一点:
create table #hmo (hmoid varchar(6), name varchar(25), Addon10 varchar(25),
Addon15 varchar(25), addon20 varchar(25));
insert into #hmo
values ('RFFF', 'Blah','img path1', 'img path2', 'img path1');
select hmoid, name, addval, addcount = count(adds)
FROM #hmo
UNPIVOT
(
addval FOR adds IN
(addon10, addon15, addon20)
) as unpvt
group by hmoid, name, addval having count(*) > 1
会给出结果:
hmoid name addval addcount
RFFF Blah img path1 2
通过这种方式,您可以检查表中的每一行,并查看具有任意两列或多列具有相同值的行。
如果你有很多专栏,这确实有可能变得乏味;最简单的解决方法是使用sys.tables
和sys.columns
中的信息动态构建查询。