2013-01-20 4 views
2

SQL 쿼리를 사용하여 작업하지 않아도되고 간단한 쿼리처럼 보이는 것이 제 정신을 차게합니다. 다양한 기준에 따라 반복을 선택하려고하는 트랜잭션 테이블이 있습니다. 이 표에서SQL Select : 두 개 이상의 열이 동일한 행을 가져옵니다.

[Transaction] 
* ID   int 
    Transacted datetime 
    Name  nvarchar(50) 
    Description nvarchar(4000) 
    size  bigint 

, 나는 이름/크기의 중복을 찾아 날짜와 설명이 다른 경우에도 이름, 같은 크기의 트랜잭션을 가진 모든 기록을 다시보고해야합니다 다음과 같이 관련 테이블 구조입니다. 나머지 데이터 얻을 수

SELECT Name, COUNT(Name) AS Count 
FROM  Transaction 
GROUP BY Name 

을 그리고 내가 할 내부가 조인 수 : 나는 다음과 단지 이름이 수를 얻을 수

SELECT data.ID, data.Transacted, data.Name, data.Description, data.Size, counts.Count 
FROM (SELECT Name, COUNT(Name) AS Count 
     FROM Transaction 
     GROUP BY Name) AS counts 
INNER JOIN Transaction AS data ON counts.Name = data.Name 
WHERE  (counts.Count > 1) 
ORDER BY data.Name, data.Transacted 

을하지만 분명히 이것은 단지주고있다 이름이 반복되는 곳에서의 거래. 이름과 크기가 반복되는 곳이 아닙니다.

필자는이 부분을 끝내기위한 도움을 찾고 있는데, 라인이 같은 이름과 크기의 반복을 나타내는 모든 데이터를보고합니다. 두 열의 데이터를 하나의 결과로 쉽게 연결하여 비교할 수는 있지만 최적의 방법이라고 확신하지 못합니다. 사전에

감사합니다.

SELECT Name, Size, COUNT(Name) AS Count 
FROM  Transaction 
GROUP BY Name, Size Having COUNT(Name) > 1 

답변

1

질문의 코드에

+0

OVER가 지원되지 않는다는 오류가 발생하더라도이 기능은 훌륭합니다. 이것은 SQL 디자이너 문제인 것처럼 보입니다. 나는 올바른 결과를 얻는다. 도와 줘서 고마워! – tobint

+0

@tobint - 예, 비주얼 디자이너는 새로운 구문 중 일부를 좋아하지 않습니다. –

1

변경 당신은 또한 추가 열이 필요하다는 것을 나타냅니다. Name, size을 복사하여 모든 행을 반환하려면

WITH CTE 
    AS (SELECT *, 
       COUNT(*) OVER (PARTITION BY Name, size) AS Cnt 
     FROM [Transaction]) 
SELECT ID, 
     Transacted, 
     Name, 
     Description, 
     size 
FROM CTE 
WHERE Cnt > 1 
+0

나는 쉽게 쉽게 잊을 수 있음을 알고있었습니다. SQL 쿼리 도구를 사용한 이후로 문자 그대로 수년이되었습니다. :) 그건 그렇고, 나는 아직도이 행에 대한 나머지 데이터를 반환하는 데 문제가 있습니다. 이것은 이름과 개수를 반환하지만 ID 기반의 특정 행을 확인할 방법이 없습니다. 이 하위 쿼리를 사용하여 내부 조인 있지만 파일 이름에 조인 경우 여전히 파일 이름이 같은 행을 다시 얻을 수 있지만 크기가 아닙니다. – tobint

관련 문제