2015-10-07 64 views
1

這是樣板預期結果表SQL Server查詢得到鮮明的列數表

enter image description here

正如你可以看到我有房客與相應區域的列表。我需要創建一個'Count'列來計算給定TENANT中不同區域的數量。例如租戶'CMBINA13'有兩個不同的區域。所以它應該在count列中輸出2,與只有1個不同區域的下一個tenant示例相同。

這裏是我已經初步得到了

select tenantcode , b.name , AreaSqm , 
     COUNT(*) OVER (PARTITION BY AreaSqm) AS 'Count' 
from TENANT 

,並給出了一個邏輯上不正確的輸出這樣

enter image description here

任何幫助,將不勝感激:)

+0

Count是一個聚合函數,因此您是否嘗試過使用分組? – Hexana

+0

它將合併tenantcode作爲一個,我需要顯示tenantcode的每個細節,我只是沒有顯示銷售專欄 – rickyProgrammer

回答

5

你必須你可以用COUNT .. OVER來做到這一點,你也不能用直接。所以,一個解決方案是在子查詢數DISTINCT areasqm,這樣的事情:

SELECT 
    t.tenantcode , name , AreaSqm , c.areaCount 
FROM TENANT AS t 
INNER JOIN 
(
    SELECT tenantcode, COUNT(DISTINCT areasqm) AS areaCount 
    FROM tenant 
    GROUP BY tenantcode 
) AS c ON t.tenantcode = c.tenantcode; 

這會給你:

enter image description here

+0

我會試試這個!所以計數明顯不適用於分區...? – rickyProgrammer

+0

@rickyProgrammer - 是的,你會得到一個錯誤:'使用DISTINCT是不允許與OVER子句.' –

+0

我會接受!非常感謝。有效 :) – rickyProgrammer

0

如果你想:

select tenantcode, b.name, AreaSqm , 
     COUNT(DISTINCT areasqm) OVER (PARTITION BY tenantcode) AS acnt 
from TENANT; 

然後你可以做到這一點沒有聚合/加入您只需枚舉值並計算它們等於1的位置即可:

select tenantcode, name, AreaSqm, 
     sum(case when seqnum = 1 then 1 else 0 end) over (partition by tenantcode) as acnt 
from (select t.*, 
      row_number() over (partition by tenantcode, areasqm order by tenantcode) as seqnum 
     from TENANT t 
    ) t