2011-03-15 45 views
1

本學期我正在學習數據庫課程,我們正在學習SQL。我瞭解最簡單的查詢,但我使用計數聚合函數有一些困難。SQL計數和加入

我應該把一個廣告號碼和一個房產號碼聯繫​​到一個分行號碼,這樣我就可以通過分行號碼計算廣告的數量並計算它們的成本。我建立了我認爲是兩個合適的新視圖,但我對於爲select語句寫什麼是無能爲力的。我以正確的方式接近這個嗎?我有一種感覺,我正在複雜這個大好時機...

with ad_prop(ad_no, property_no, overseen_by) as 
    (select a.ad_no, a.property_no, p.overseen_by 
    from advertisement as a, property as p 
    where a.property_no = p.property_no) 
with prop_branch(property_no, overseen_by, allocated_to) as 
    (select p.property_no, p.overseen_by, s.allocated_to 
    from property as p, staff as s 
    where p.overseen_by = s.staff_no) 

select distinct pb.allocated_to as branch_no, count(???) * 100 as ad_cost 

from prop_branch as pb, ad_prop as ap 
where ap.property_no = pb.property_no 
group by branch_no; 

任何有識之士將不勝感激!

+0

謝謝@PortableWorld正確格式化我的代碼! – Eric 2011-03-15 02:04:49

+0

沒問題。共同的監督。我只希望我知道你的問題的答案。 – 2011-03-15 02:10:58

回答

0

你可以把它簡化這樣的:

廣告
- ad_no
- property_no

財產
- property_no
- overseen_by

人員
- staff_no
- allocated_to

SELECT s.allocated_to AS branch, COUNT(*) as num_ads, COUNT(*)*100 as ad_cost 
FROM advertisement AS a 
INNER JOIN property AS p ON a.property_no = p.property_no 
INNER JOIN staff AS s ON p.overseen_by = s.staff_no 
GROUP BY s.allocated_to; 

更新:以上改變,以匹配您的模式需要

+0

@Eric - 我更新了我的模式以符合您的需求 – 2011-03-15 03:20:22

0

我可以告訴你,你正在它太複雜。它應該是一個帶有幾個連接的選擇語句。你應該重新閱讀的章節上加入或看看下面的鏈接

http://www.sql-tutorial.net/SQL-JOIN.asp

一個加入允許您從基於兩個表上之間的公共密鑰「結合」的數據兩張桌子(您可以將更多桌子連在一起,更多加入)。一旦你有了這個「加入」表,你可以假裝它實際上是一個表(別名用來表示該列來自哪裏)。你理解聚合是如何在單個表上工作的嗎?

我不希望給你答案,讓你可以真正學到:)

+0

因此,我根據它們的通用屬性加入這三個表,然後按branch_id分組,然後計算每個branch_id的出現次數? – Eric 2011-03-15 02:24:45

+0

是啊:)聽起來像你現在明白了 – clyc 2011-03-15 02:33:03

+0

謝謝,我開始理解今天一點點更好的概念! – Eric 2011-03-16 01:41:27

0

您可以將您WITH子句爲一個語句。然後,我認爲你缺少的一塊是列定義中引用的列必須彙總,如果它們不包含在GROUP BY子句中。所以你GROUP BY你的獨特列,然後在你的列定義中應用你的聚合和數學。

SELECT 
    s.allocated_to AS branch_no 
    ,COUNT(a.ad_no) AS ad_count 
    ,(ad_count * 100) AS ad_cost 
... 
GROUP BY s.allocated_to