【问题标题】:SQL SERVER QUERY to get the Number of Distinct column in tableSQL SERVER QUERY 获取表中不同列的数量
【发布时间】:2015-10-07 09:39:29
【问题描述】:

这是示例预期结果表

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

这是我最初得到的东西

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

它会给出这样的逻辑错误输出

任何帮助将不胜感激:)

【问题讨论】:

  • Count 是一个聚合函数,所以你尝试过分组吗?
  • 它将tenantcode合并为一个,我需要显示tenantcode的每个细节,我只是没有显示销售列

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


【解决方案1】:

你必须数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;

这会给你:

【讨论】:

  • 我会试试这个!所以count distinct不适用于分区...?
  • @rickyProgrammer - 是的,你会得到一个错误:Use of DISTINCT is not allowed with the OVER clause.
【解决方案2】:

如果你愿意:

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

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多