2015-06-25 99 views
2

對於標題很抱歉,很難總結我所要求的內容。計算查詢中列的行數

鑑於此:

SELECT [FirstName], [LastName], '-', [Thing] FROM.....

John Smith - Plow 
James Jones - Plow 
James Jones - Shovel 
James Jones - Axe 
Sarah Lee - Hammer 
Sarah Lee - Pliers 

我需要得到這個:

John Smith - Plow - 1 
James Jones - Plow - 3 
James Jones - Shovel - 3 
James Jones - Axe - 3 
Sarah Lee - Hammer - 2 
Sarah Lee - Pliers - 2 

我需要包括作爲列的時間的總和數相同的人已經出現在行。

這聽起來像一個樞紐解決方案,但樞軸讓我的大腦受傷。有另一種方法嗎?如果沒有,任何人都可以解釋這個關鍵點,如果這就是它要做的事情?

謝謝!

回答

5
SELECT *, 
     COUNT(*) OVER (PARTITION BY FirstName, LastName) cnt 
FROM mytable 
+1

http://sqlfiddle.com/#!3/c8cf5/7 –

+0

@ConradFrix:謝謝,只想做我自己! – Quassnoi

+0

沒問題。在添加答案之前我正在做小提琴,並且看到你已經回答了。隨意將其添加到您的答案(不要求歸屬地) –

0

這可能不是寫它的最有效的方式,但完成工作。

select 
firstname 
,Surname 
,count(firstname + Surname) over (partition by firstname + surname) as NameOccurences 
from table 
+0

小心那裏。用'firstname' /'surname'分區並不是一回事。 「alpha」+「beta」=「alph」+「abeta」,如果保持字段分離,則不會進行匹配。當有一個簡單,正確的方法來處理它時,不要嘗試增加空格。 – HABO

+0

@HABO,你能爲我澄清一下嗎?我沒有跟隨。 「alpha」+「beta」不等於「alpha」+「abeta」。我不明白「保持領域獨立」的意思,或者「添加空間」的含義。 嚴重的問題。不要co。。 –

+0

你有'(用名字+姓氏分區)'。這將把名字/姓氏對「alpha」/「beta」和「alph」/「abeta」視爲相同,因爲他們都變成了「alphabeta」。使用'(通過名字分區,姓氏)'將把它們視爲不同的,因爲它檢查兩個單獨的字段。黑客應該添加一個空白:'(通過名字分區+''+姓氏]'。雖然在這種情況下可能會起作用,但我看到太多人試圖通過連接所有列來比較行,但沒有意識到可能出現什麼問題。我很高興解釋。不要co。。 – HABO

0

我實際上找到了一種方法,我自己。儘管我喜歡「OVER/Partition by」解決方案。更短,但對我而言並不明顯。

這裏就是我最終想出了:

with cte as (
    select last_name, first_name, count(1) as theCount 
    from MetalThings 
    group by last_name, first_name 
) 
select m.*, 
     cte.theCount 
from MetalThings m 
    JOIN cte on (m.last_name = cte.last_name and m.first_name = cte.first_name)