2016-06-21 9 views
1

Ich habe Tabelle wie folgt:Oracle: SUM-Säule nur Duplikate Wert anderer Spalte

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

I Gesamtzahl der (Anzahl) für nur Duplikate (Name) und obwohl Gesamtzahl von zurückgeben möchten (Number) bei derselben Abfrage das folgende Ergebnis zu erhalten:

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

Antwort

2

eine Lösung ist eine Fensterfunktion zu verwenden, um die Anzahl der Vervielfältigungen pro Namen auf jeder Zeile zu zählen, dann summiert alle Werte in einer Spalte, und summiere nur Werte, bei denen der Datensatz wird auf einer anderen Spalte dupliziert:

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

Vielen Dank es funktioniert –

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

dieses Versuchen

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

Hier ist eine Möglichkeit:

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