2016-05-16 4 views
0

Ich habe die folgende SQL immer korrekte Ergebnis hat:aus mehreren Multiple Counts auswählen Tabelle JOIN, die mehrere Group_BYs

SELECT 
companies.name as company_name, 
locations.country_code as location, 
ad_messages.ad_template_name as creative, 
impressions.width as width, 
impressions.height as height, 
count('impressions.id') as impressions 
FROM "impressions" 
INNER JOIN "ad_messages" ON "ad_messages"."id" = "impressions"."ad_message_id" 
INNER JOIN "visitors" ON "visitors"."id" = "ad_messages"."visitor_id" 
INNER JOIN "companies" ON "companies"."visitor_id" = "visitors"."id" 
INNER JOIN "locations" ON "locations"."visitor_id" = "visitors"."id" 
WHERE (visitors.user_id = 171) 
AND (impressions.created_at >= '2016-03-17 16:17:20.241276' 
AND impressions.created_at <= '2016-05-16 16:17:20.241336') 
GROUP BY 
companies.name, 
locations.country_code, 
ad_messages.ad_template_name, 
impressions.width, 
impressions.height 
ORDER BY 
companies.name, 
locations.country_code, 
ad_messages.ad_template_name, 
impressions.width, 
impressions.height 

ich das Ergebnis (Anzahl der Impressions) gruppiert und subgrouped die company_name, Standorte und ad_messages.

Impressions only Result

Ich kann den Prozess für Klicks wiederholen und wie so Ergebnis (Anzahl der Klicks) gruppiert und subgrouped durch verschiedene Filter erhalten:

SELECT 
companies.name as company_name, 
locations.country_code as location, 
ad_messages.ad_template_name as creative, 
ad_clicks.width as width, 
ad_clicks.height as height, 
count('ad_clicks.id') as ad_clicks 
FROM "ad_messages" 
INNER JOIN "ad_clicks" ON "ad_clicks"."ad_message_id" = "ad_messages"."id" 
INNER JOIN "visitors" ON "visitors"."id" = "ad_messages"."visitor_id" 
INNER JOIN "companies" ON "companies"."visitor_id" = "visitors"."id" 
INNER JOIN "locations" ON "locations"."visitor_id" = "visitors"."id" 
WHERE (visitors.user_id = 171) 
AND (ad_clicks.created_at >= '2016-03-17 16:17:20.241276' 
AND ad_clicks.created_at <= '2016-05-16 16:17:20.241336') 
GROUP BY 
companies.name, 
locations.country_code, 
ad_messages.ad_template_name, 
ad_clicks.width, 
ad_clicks.height 
    ORDER BY 
companies.name, 
locations.country_code, 
ad_messages.ad_template_name, 
ad_clicks.width, 
ad_clicks.height 

jedoch - Ich mag beide Impressionen und Klicks kombinieren würde in einer Abfrage habe ich versucht:

SELECT 
companies.name as company_name, 
locations.country_code as location, 
ad_messages.ad_template_name as creative, 
impressions.width as width, 
impressions.height as height, 
ad_clicks.width as click_width, 
ad_clicks.height as click_height, 
count('impressions.id') as impressions, 
count('ad_clicks.id') as clicks 
FROM "ad_messages" 
INNER JOIN "impressions" ON "impressions"."ad_message_id" = "ad_messages"."id" 
INNER JOIN "visitors" ON "visitors"."id" = "ad_messages"."visitor_id" 
INNER JOIN "companies" ON "companies"."visitor_id" = "visitors"."id" 
INNER JOIN "locations" ON "locations"."visitor_id" = "visitors"."id" 
LEFT JOIN "ad_clicks" ON "ad_clicks"."ad_message_id" = "ad_messages"."id" 
WHERE (visitors.user_id = 171) 
AND (impressions.created_at >= '2016-03-17 16:17:20.241276' 
AND impressions.created_at <= '2016-05-16 16:17:20.241336') 
GROUP BY 
companies.name, 
locations.country_code, 
ad_messages.ad_template_name, 
impressions.width, 
impressions.height, 
ad_clicks.width, 
ad_clicks.height 

Das gab mir völlig falsche Ergebnisse! count (impression) und count (ad_clicks) hatten den gleichen Wert. Gibt es eine Möglichkeit, korrekte Zahlen aus einem SQL zu erhalten?

Jede Hilfe wird geschätzt. Vielen Dank!

Antwort

1

Sie könnten count(col_name) over (partition by .... order by ...) so verwenden, verwenden Sie select distinct anstelle von group by. Und versuchen Sie es mit alias anstelle von full_table_name.

SELECT DISTINCT 
    companies.name as company_name, 
    locations.country_code as location, 
    ad_messages.ad_template_name as creative, 
    impressions.width as width, 
    impressions.height as height, 
    ad_clicks.width as click_width, 
    ad_clicks.height as click_height, 
    count('impressions.id') over (partition by companies.name, locations.country_code, 
      ad_messages.ad_template_name, impressions.width, impressions.height 
      order by companies.name, locations.country_code, ad_messages.ad_template_name, 
      impressions.width, impressions.height) as impressions, 
    count('ad_clicks.id') over (partition by companies.name, locations.country_code, 
      ad_messages.ad_template_name, ad_clicks.width, ad_clicks.height 
      order by companies.name, locations.country_code, ad_messages.ad_template_name, 
      ad_clicks.width, ad_clicks.height) as clicks 
FROM "ad_messages" 
INNER JOIN "impressions" ON "impressions"."ad_message_id" = "ad_messages"."id" 
INNER JOIN "visitors" ON "visitors"."id" = "ad_messages"."visitor_id" 
INNER JOIN "companies" ON "companies"."visitor_id" = "visitors"."id" 
INNER JOIN "locations" ON "locations"."visitor_id" = "visitors"."id" 
LEFT JOIN "ad_clicks" ON "ad_clicks"."ad_message_id" = "ad_messages"."id" 
WHERE (visitors.user_id = 171) 
    AND (impressions.created_at >= '2016-03-17 16:17:20.241276' 
    AND impressions.created_at <= '2016-05-16 16:17:20.241336') 
ORDER BY 
    companies.name, 
    locations.country_code, 
    ad_messages.ad_template_name, 
    impressions.width, 
    impressions.height, 
    ad_clicks.width, 
    ad_clicks.height 

Ein Test in SQLFIDDLE

Verwandte Themen