SQL计数列中的重复项

时间:2014-01-14 00:36:33

标签: sql duplicates

我一直坚持这个问题一段时间,并在网上搜索了答案..

我的问题是:

我在一列中有重复项。我想计算一列中有多少重复项,然后我想用该计数除以一个字段。我希望能够为列中的每个记录执行此操作。

基本上我希望脚本的行为与此类似

重复重复次数 - >将字段A除以重复次数。

示例数据:

t1.Invoiceno | t2.Amount | t2.orderno
-------------------------------------
     201412       200      P202
     201412       200      P205
     302142       500      P232
     201412       300      P211
     450402       250      P102
     450402       250      P142
     450402       250      P512

期望的结果:

Invoiceno | Amount | orderno| duplicates|amount_new
-------------------------------------------------
 201412       200      P202        2       100
 201412       200      P205        2       100
 302142       500      P232        1       500
 201552       300      P211        1       300
 450402      1200      P102        3       400
 450402      1200      P142        3       400
 450402      1200      P512        3       400

我不想在表格中插入新列,我只想让结果显示两个新列。

2 个答案:

答案 0 :(得分:1)

这是一种方式:

select A / dups.dups
from t cross join
     (select count(*) as dups
      from (select onecol
            from t
            group by onecol
            having count(*) > 1
           ) o
     ) dups

编辑:

好吧,现在问题已经澄清到了更合理的地方。您可以使用与上述类似的方法,但dups子查询需要由invoiceamount汇总:

select amount / dups.dups as new_amount
from table t join
     (select invoice, amount, count(*) as dups
      from table t
     ) dups
     on t.invoice = dups.invoice and t.amount = dups.amount;

答案 1 :(得分:0)

这是另一种方式:

Declare @tempTable Table (  ID int , A int)

INSERT INTO @tempTable  VALUES (1, 12)
INSERT INTO @tempTable  VALUES (1, 12)
INSERT INTO @tempTable  VALUES (2, 20)
INSERT INTO @tempTable  VALUES (2, 24)
INSERT INTO @tempTable  VALUES (2, 15)
INSERT INTO @tempTable  VALUES (3, 10)
INSERT INTO @tempTable  VALUES (5, 12)

-------------------------------------------

;WITH DupsCTE (ID, DuplicateCount) AS
(
    SELECT ID, COUNT(*) AS DuplicateCount FROM @tempTable GROUP BY ID
)
SELECT t.ID, t.A,
    c.DuplicateCount, t.A / c.DuplicateCount AS ModifiedA
FROM 
    @tempTable t
    INNER JOIN DupsCTE c ON c.ID = t.ID