Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL SERVER查询以获取表中不同列的数目_Sql_Sql Server 2008_Database Partitioning - Fatal编程技术网

SQL SERVER查询以获取表中不同列的数目

SQL SERVER查询以获取表中不同列的数目,sql,sql-server-2008,database-partitioning,Sql,Sql Server 2008,Database Partitioning,这是示例预期结果表 正如你所看到的,我有一份相应面积的租户名单。我需要创建一个列“Count”,它将计算给定租户中不同区域的数量。例如,承租人“CMBINA13”有两个不同的区域。因此,它应该在count列中输出2,与下一个租户示例相同,该示例仅具有1个不同的区域 这是我最初得到的 select tenantcode , b.name , AreaSqm , COUNT(*) OVER (PARTITION BY AreaSqm) AS 'Count' from TEN

这是示例预期结果表

正如你所看到的,我有一份相应面积的租户名单。我需要创建一个列“Count”,它将计算给定租户中不同区域的数量。例如,承租人“CMBINA13”有两个不同的区域。因此,它应该在count列中输出2,与下一个租户示例相同,该示例仅具有1个不同的区域

这是我最初得到的

select tenantcode ,  b.name , AreaSqm  ,
       COUNT(*) OVER (PARTITION BY AreaSqm) AS 'Count'
from    TENANT
它给出了这样一个逻辑上不正确的输出


任何帮助都将不胜感激:)

您必须计算
不同的面积sqm
,但您不能使用
计数。。超过
,您也不能直接使用
按租户代码、名称、面积分组。因此,一种解决方案是在子查询中计算
不同的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;
这将为您提供:


您必须计算
不同的面积sqm
,但不能使用
计数。。超过
,您也不能直接使用
按租户代码、名称、面积分组。因此,一种解决方案是在子查询中计算
不同的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;
然后,您就可以在不使用聚合/联接的情况下执行此操作。您只需枚举值,并在值等于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
如果您想要:

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

Count是一个聚合函数,所以您尝试过按分组吗?它会将租户代码合并为一个,我需要显示租户代码的每个细节,我只是没有显示sales columnCount是一个聚合函数,所以您尝试过按分组吗?它会将租户代码合并为一个,我需要显示租户代码的每个细节,我只是没有显示销售专栏,我要试试这个!所以count distinct不适用于分区…?@rickyProgrammer-是的,您会得到一个错误:
在OVER子句中不允许使用distinct。
我会试试这个!所以count distinct不适用于分区…?@rickyProgrammer-是的,您将得到一个错误:
在OVER子句中不允许使用distinct。