SQL SERVER QUERY以获取表

时间:2015-10-07 09:39:29

标签: sql sql-server-2008 database-partitioning

这是样本预期结果表

enter image description here

如您所见,我有一个具有相应区域的租户列表。我需要创建一个列'Count',它将计算给定TENANT中不同Area的数量。例如,租户'CMBINA13'有两个不同的区域。因此它应该在count列中输出2,与仅具有1个不同区域的下一个租户示例相同。

这是我最初得到的

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

并且它提供了逻辑上不正确的输出,如此

enter image description here

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:5)

您必须计算DISTINCT areasqm,但不能使用COUNT .. OVER执行此操作,并且您不能直接使用GROUP BY tenantcode , name , AreaSqm执行此操作。因此,一种解决方案是在子查询中计算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

答案 1 :(得分: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