SQL 服务器查询以获取 table 中不同列的数量
SQL SERVER QUERY to get the Number of Distinct column in table
这是样本预期结果table
如您所见,我有一个相应区域的租户列表。我需要创建一个列 'Count',它将计算给定租户中不同区域的数量。例如租户 'CMBINA13' 有两个不同的区域。所以它应该在计数列中输出 2,与下一个只有 1 个不同区域的租户示例相同。
这是我最初得到的
select tenantcode , b.name , AreaSqm ,
COUNT(*) OVER (PARTITION BY AreaSqm) AS 'Count'
from TENANT
它给出了这样一个逻辑上不正确的输出
任何帮助将不胜感激:)
你必须数 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;
这会给你:
如果你想:
select tenantcode, b.name, AreaSqm ,
COUNT(DISTINCT areasqm) OVER (PARTITION BY tenantcode) AS acnt
from TENANT;
那么您可以在没有 aggregation/join 的情况下执行此操作。您只需要枚举值并计算它们等于 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
这是样本预期结果table
如您所见,我有一个相应区域的租户列表。我需要创建一个列 'Count',它将计算给定租户中不同区域的数量。例如租户 'CMBINA13' 有两个不同的区域。所以它应该在计数列中输出 2,与下一个只有 1 个不同区域的租户示例相同。
这是我最初得到的
select tenantcode , b.name , AreaSqm ,
COUNT(*) OVER (PARTITION BY AreaSqm) AS 'Count'
from TENANT
它给出了这样一个逻辑上不正确的输出
任何帮助将不胜感激:)
你必须数 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;
这会给你:
如果你想:
select tenantcode, b.name, AreaSqm ,
COUNT(DISTINCT areasqm) OVER (PARTITION BY tenantcode) AS acnt
from TENANT;
那么您可以在没有 aggregation/join 的情况下执行此操作。您只需要枚举值并计算它们等于 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