2017-07-25 169 views
3

使用SQL Server,我不是DBA,但可以编写一些通用SQL。现在拉出我的头发大约一个小时。搜索我找到了几个解决方案,但是由于GROUP BY的工作原理,它们都失败了。尝试在两行和两列中查找重复值 - SQL Server

我有两列我试图重复检查表:

  • 用户ID
  • 订购日期

我在寻找同时具有useridorderdate行作为重复。我想显示这些行。

如果我使用group by,我不能拉任何其他数据,例如订单ID,因为它不在group by子句中。

+4

欢迎** ** SO ..添加以下数据问题:示例数据,预期结果和您迄今尝试的查询 –

+0

https://stackoverflow.com/help/how-to-ask –

+0

了解如何提出问题。没有样本数据,表格结构,期望人们如何帮助您? – Eric

回答

4

你可以在子查询中使用分组查询:

SELECT * 
FROM mytable a 
WHERE EXISTS (SELECT userid, orderdate 
       FROM  mytable b 
       WHERE a.userid = b.userid AND a.orderdate = b.orderdate 
       GROUP BY userid, orderdate 
       HAVING COUNT(*) > 1) 
+1

这将如何'有计数( *)= 0'给OP想要什么? –

+2

@WEI_DBA我从字面上不知道我在想什么......编辑并修复 – Mureinik

+0

Mureinik你是我的英雄。这工作完美。我已经能够修改它以添加我需要的信息和宾果。谢谢 - 认真。 – Tacos

0

您可以通过使用GROUPBY且得到重复。像这样:

SELECT 
    userid,orderdate, COUNT(*) 
FROM 
    yourTable 
GROUP BY 
    userid,orderdate 
HAVING 
    COUNT(*) > 1 

编辑:

SELECT * FROM yourTable 
WHERE CONCAT(userid,orderdate) IN 
(
    SELECT 
     CONCAT(userid,orderdate) 
    FROM 
     yourTable 
    GROUP BY 
     userid,orderdate 
    HAVING 
     COUNT(*) > 1 
) 
+1

是的,这会给你重复的,但他们也想要结果集中的所有列。好开始。 –

+0

是的,谢谢你:)这是我开始的地方,但无法得到其余的列作为@WEI_DBA提到 – Tacos

1

你也可以使用一个窗口函数:

; With CTE as 
    (Select * 
    , count(*) over (partition by UserID, OrderDate) as DupRows 
    from MyTable) 

Select * 
from CTE 
where DupRows > 1 
order by UserID, OrderDate 
+0

感谢您的帮助! – Tacos

0
SELECT * 
FROM myTable 
WHERE CAST(userid as Varchar) + '/' + CONVERT(varchar(10),orderdate,103) In 
(
    SELECT 
     CAST(userid as Varchar) + '/' + CONVERT(varchar(10),orderdate,103) 
    FROM myTable 
    GROUP BY userid , orderdate 
    HAVING COUNT(*) > 1 
); 
+0

虽然在技术上,这会给你正确的答案,如果数据集很大,串联会导致性能下降。你会想要独立评估这两个字段。 – Eli

+0

感谢您的帮助! – Tacos