2017-03-21 56 views
6

mam komplet punktów danych dla wielu fanów różnych kont dla różnych dni, należących do różnych marek:SQL GROUP BY tylko w podzapytaniu

|brand|account|date|fans| 
|-----|-------|----|----| 
|Ford |ford_uk|... |10 | 
|Ford |ford_uk|... |11 | 
|Ford |ford_us|... |20 | 
|Ford |ford_us|... |21 | 
|Jeep |jeep_uk|... |30 | 
|Jeep |jeep_uk|... |31 | 
|Jeep |jeep_us|... |40 | 
|Jeep |jeep_us|... |41 | 

próbuję do zwrotu całości przez fanów marki, zdefiniowane jako suma Maxa fanów dla każdego z rachunków marki:

Ford: 32 
Jeep: 72 

próbowałem podkwerenda takiego:

(SELECT sum(account_fans) 
    FROM 
    (
    SELECT max(fans) AS account_fans 
    GROUP BY account 
) subquery_name 
) AS total_fans 

Problem polega na tym, że otrzymuję:

ERROR: subquery uses ungrouped column account from outer query.

Ale nie chcę zgrupować zapytania zewnętrznego. Możesz pomóc?

+1

Myślę, że jest literówka w przykładowych danych, ostatnie dwa wiersze powinny mieć inne konto –

+0

Dzięki @StefanoZanini. Naprawiony. –

Odpowiedz

3

Czy próbowałeś pisać zapytanie w ten sposób?

select brand, sum(mx) 
from (
      select brand, account, max(fans) mx 
      from account_fans 
      group by brand, account 
     ) t1 
group by brand 
+0

Po prostu brakuje aliasu podkwerendy. –

+0

@ ClodoaldoNeto edytowane, dziękuję! –

4

Potrzebne są dwa poziomy podzapytaniami:

select brand, sum(fans) 
from (select brand, account, max(fans) as fans 
     from account_fans af 
     group by brand, account 
    ) ba 
group by brand; 
+0

To jest 'max' w wewnętrznej kwerendzie i' suma 'na zewnętrznej. –

+0

@ ClodoaldoNeto. . . Dziękuję Ci. –

0

Spróbuj poniżej zapytania:

SELECT T1.brand, sum(A.maximum) 
FROM your_table T1 
JOIN 
(
    SELECT brand, account, max(fans) maximum 
    FROM your_table T2 
    GROUP BY brand, account 
) A ON T2.brand = T1.brand 
GROUP BY brand 
0

Spróbuj tego:

-- temporary table like your data ------------ 
DECLARE @account_fans TABLE(brand NVARCHAR(10),account NVARCHAR(10),fans INT) 
INSERT INTO @account_fans VALUES ('Ford', 'ford_uk',10),('Ford', 'ford_uk',11), 
('Ford', 'ford_us',20),('Ford', 'ford_us',21),('Jeep', 'jeep_uk',30), 
('Jeep', 'jeep_uk',31),('Jeep', 'jeep_us',40),('Jeep', 'jeep_us',41) 
-- temporary table like your data ------------ 

SELECT * FROM @account_fans -- your table 


SELECT brand, SUM(fans) fans FROM ( 
SELECT brand,account,MAX(fans) fans FROM @account_fans GROUP BY account,brand 
) A GROUP BY brand -- output you require 

Nadzieję, że to pomaga. :)