2

私はかなり長い間SQLクエリを操作する必要はありませんでしたが、単純なクエリのように見えることが私を狂わせています。さまざまな基準に基づいて繰り返しを選択しようとしているトランザクションのテーブルがあります。関連するテーブル構造は次のとおりです。

[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

しかし、明らかにこれは、名前とサイズの両方が繰り返されるトランザクションではなく、名前が繰り返されるトランザクションのみを提供します。

行が同じ名前と同じサイズの繰り返しを示しているすべてのデータを報告するために、この部分を仕上げるのに役立つことを探しています。両方の列のデータを1つの結果に簡単に連結して比較することはできますが、それが最適なアプローチかどうかはわかりません。

前もって感謝します。

4

2 に答える 2

1

に変更します

SELECT   Name, Size, COUNT(Name) AS Count
FROM     Transaction
GROUP BY Name, Size Having COUNT(Name) > 1
于 2013-01-20T21:32:42.923 に答える
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 
于 2013-01-20T21:34:06.050 に答える