SQL:比较同一表中的行
我试图比较单个表中的行 并找出同一id下的“addr”和“zip”是相同还是不同SQL:比较同一表中的行,sql,Sql,我试图比较单个表中的行 并找出同一id下的“addr”和“zip”是相同还是不同 id | addr | zip ------+----------+---------- 1 | 123 | 0000 1 | 123 | 0000 1 | 123 | 0001 2 | 222 | 1000 2 | 221 | 1000 因此,结果应该
id | addr | zip
------+----------+----------
1 | 123 | 0000
1 | 123 | 0000
1 | 123 | 0001
2 | 222 | 1000
2 | 221 | 1000
因此,结果应该是ID1具有有效的addr和无效的zip
id 2具有无效的地址和有效的zip
任何提示都将不胜感激!谢谢 按id分组。选择id、
计数(不同的地址)
和计数(不同的邮政编码)
列。
SELECT id
, CASE s.addrcount
WHEN 1 THEN 'valid'
ELSE 'invalid' END as addrok
, CASE s.zipcount
WHEN 1 THEN 'valid'
ELSE 'invalid' END as zipok
FROM
(
SELECT id
, count(distinct addr) as addrcount
, count(distinct zip) as zipcount
FROM table1
GROUP BY id
) as s
筛选包含不同地址或拉链编号的行>1
这将为您提供重复数据不一致的ID 例如:
SELECT id, COUNT(DISTINCT addr) nAddr, COUNT(DISTINCT zip) nZip
FROM [mytable]
GROUP BY id
HAVING nAddr > 1 OR nZip > 1
干杯,查询
SELECT id, COUNT(DISTINCT addr), COUNT(DISTINCT zip)
FROM YOUR_TABLE
GROUP BY id
…应给出示例数据的以下结果
1,1,22、2、1 粗体中大于1的数字表示“无效”项目 如果您想实际对此进行筛选,可以使用HAVING子句,例如:
SELECT id, COUNT(DISTINCT addr) ADDR_COUNT, COUNT(DISTINCT zip) ZIP_COUNT
FROM YOUR_TABLE
GROUP BY id
HAVING ADDR_COUNT > 1 OR ZIP_COUNT > 1
我建议,如果您实际上不希望数据库中存在这种“不匹配”的数据,请重新设计您的数据模型,以便在一开始就不会发生重复。没有重复,没有不匹配 -1使用
[tablename]
是TSQL语法。并且不能在聚合列上执行where
。这就是<代码>的目的。另外,您忘记了一个distinct
您关于distinct和have的看法是正确的。它是固定的。关于TSQL,我不必与非标准SQL语法结合。如果以前不清楚[我的表]是否应该替换为实际的表名,我现在就说明。谢谢您的帮助!“s.addr计数”应该是这样的,还是计数(s.addr)?不管怎样,我得到的是00907。00000—“此区域缺少右括号:/是否应该这样使用“s.addrcount”
:是的,您的意思是不能在案例中直接使用计数?就像…CASE COUNT(DISTINCT addr)当1时,那么…ELSE…结束为which…
?@Andriy,不,您不能在CASE中使用聚合函数。。当
时,因为聚合函数组合了来自多行和大小写的值。。当按行计算时。这就是为什么您需要subselect。想法是验证id和(addr,zip)之间的函数依赖关系。您的表有重复的行,因此不在中。这正是我提出的解决方案。现在,@OP将测试您的查询并最终接受答案,因为标准的SQL习惯用法将与他的Oracle实例一起使用,没有人对您投反对票(我投赞成票)。我喜欢stackoverflow,lol:D.@Anthony不管它值多少钱,我后来注意到了你的答案,并高估了你的票数,意识到你先到了那里!谢谢你的确认:D。