2016-06-21 128 views
1

只重複值的SUM列我有如下表:甲骨文:另一列

Name  |Number 
------------------ 
name1 |15 
name1 |7 
name2 |10 
name3 |9 
name4 |11 
name4 |4 

我想回到(號碼)只重複(名稱)的總數,雖然得到的總數(號)在同一查詢得到以下結果:

Duplicate Count |Total Count 
    -------------------------- 
    37   | 56 

回答

2

一種解決方案是使用一個窗口函數來計算每行每名複製數量,再總結一列中的所有值,並總和只值的地方記錄被複制在另一個列:

with values_cnt as (
select 
    count(*) over (partition by name) cnt, 
    value 
from 
    mytable 
) 
select 
    sum(case when cnt>1 then value end), 
    sum(value) 
from 
    values_cnt 
+0

非常感謝它的工作原理 –

0
select (select sum(Number) from Test 
    where Name in (select Name from Test group by Name having count(Name)>1))) as [Duplicate Count], 
(select sum(Number) from Test) as [Total Count] 
1

試試這個

WITH tbl 
AS (
    SELECT name1 
    ,sum(number1) AS sum1 
    ,count(*) AS cnt 
    FROM tz_Table9 
    GROUP BY name1 
) 
SELECT (
    SELECT sum(sum1) 
    FROM tbl 
    WHERE cnt > 1 
    ) AS duplicate_count 
    ,(
    SELECT sum(sum1) 
    FROM tbl 
    ) AS total_count 
FROM dual 
1

這裏有一種方法:

with sample_data as (select 'name1' name, 15 num from dual union all 
        select 'name1' name, 7 num from dual union all 
        select 'name2' name, 10 num from dual union all 
        select 'name3' name, 9 num from dual union all 
        select 'name4' name, 11 num from dual union all 
        select 'name4' name, 4 num from dual) 
-- End of subquery mimicking a table called "sample_data" with data in it 
-- See SQL below:      
select sum(case when cnt_name > 1 then num end) duplicate_sum, 
     sum(num) total_sum 
from (select name, 
       num, 
       count(*) over (partition by name) cnt_name 
     from sample_data); 

DUPLICATE_SUM TOTAL_SUM 
------------- ---------- 
      37   56