我有一个简单的表格,其中包含工具的条形码ID以及工具应属于的相关房间位置。
不幸的是,我注意到有些用户为另一个房间位置输入了相同的条形码ID。
例如,我有这两列:
barcodeNumber | RoomLocation
--------------+-------------
123456 | 400
654321 | 300
875421 | 200
654321 | 400
999999 | 250
878787 | 300
777777 | 400
999999 | 200
请注意,barcodeNumber“654321”存储在roomLocations 300& 400 ad“999999”存储在房间位置200& 250
如何编写SQL查询以列出它们所在的重复条形码Number和RoomLocation而不仅仅是重复项的“计数”?
例如,我希望看到的最终结果是:
654321 | 300
654321 | 400
999999 | 200
999999 | 250
答案 0 :(得分:3)
使用窗口函数(SQL:1999),你会得到如下结果:
with c as (
select barcodeNumber, RoomLocation,
count(*) over(partition by barcodeNumber) cnt
from t)
select barcodeNumber, RoomLocation
from c where cnt > 1
order by 1,2
您还可以使用SQL-92语法:
select barcodeNumber, RoomLocation
from t
where barcodeNumber IN (
select barcodeNumber from t
group by barcodeNumber
having count(*) > 1)
order by 1,2
答案 1 :(得分:0)
你也可以尝试一下。使用count(*) over (partition by barcodenumber)
确定重复值。
create table #sample (barcodenumber nvarchar(30),roomlocation int)
insert into #sample (barcodenumber,roomlocation)
select '123456',400 union all
select '654321',300 union all
select '875421',200 union all
select '654321',400 union all
select '999999',250 union all
select '878787',300 union all
select '777777',400 union all
select '999999',200
select barcodenumber,roomlocation from (
select *, count(*) over (partition by barcodenumber) as rnk
from #sample
)t
group by barcodenumber,roomlocation,rnk
having rnk >1
希望这可以提供帮助。
答案 2 :(得分:0)
您想找到重复的条形码吗?
;WITH tb(barcodenumber,roomlocation)AS(
SELECT '123456',400 UNION ALL
SELECT '654321',300 UNION ALL
SELECT '875421',200 UNION ALL
SELECT '654321',400 UNION ALL
SELECT '999999',250 UNION ALL
SELECT '878787',300 UNION ALL
SELECT '777777',400 UNION ALL
SELECT '999999',200
)
SELECT * FROM (
SELECT *,COUNT(0)OVER(PARTITION BY tb.barcodenumber) AS cnt FROM tb
) AS t WHERE t.cnt>1
barcodenumber roomlocation cnt ------------- ------------ ----------- 654321 400 2 654321 300 2 999999 200 2 999999 250 2
答案 3 :(得分:0)
这是获得结果的另一种方法:
SELECT barcodenumber, roomlocation
FROM table_name
WHERE barcodenumber IN (
SELECT barcodenumber
FROM table_name
GROUP BY barcodenumber
HAVING COUNT(DISTINCT roomlocation) > 1);
--If you dont have duplicate rows then just use COUNT(*)
答案 4 :(得分:0)
使用JOIN和HAVING子句:
SELECT A.barcodenumber,roomlocation
FROM #sample
JOIN
(
SELECT barcodenumber
FROM #sample
GROUP BY barcodenumber
HAVING COUNT(*) > 1
) A ON A.barcodenumber = #sample.barcodenumber