2017-02-21 273 views
0

使用SQL Server 2012的数计算字段

我有以下代码:

Select Distinct [A_number] + '-' + convert(varchar(10),[zone]) As myNumber 
FROM [dbo].[soils]; 

我需要编辑此查询给我的每myNumber的计数。 问候,

回答

1

我会做的是使用group by声明:

SELECT A_number, 
    zone, 
    COUNT(*) AS c 
FROM dbo.soils 
GROUP BY A_number, 
    zone; 

然后,使用该结果到Concat的你的领域。做这种方式将允许用指数法的:

WITH numbers AS (
    SELECT A_number, 
     zone, 
     COUNT(*) AS c 
    FROM dbo.soils 
    GROUP BY A_number, 
     zone 
) 
SELECT A_number + '-' + convert(varchar(10),zone) As myNumber, 
    c AS number_count 
FROM numbers; 
+0

通过在裸空列上操作进行组是规范模式。这允许使用合适的索引。没有WHERE子句的情况下,对于此查询的最佳索引,最好的选择是具有“(A_number,zone)”的前导列。 +10。有一个边缘情况,这个查询将返回与原始结果不同的结果。考虑具有'('1','a')'和'('1',' - a')'的'(A_number,zone)'值的行。 – spencer7593

0

使用COUNT()

SELECT COUNT(DISTINCT [A_number] + '-' + CONVERT(VARCHAR(10),[zone])) 
FROM [dbo].[soils] 

,这将给你从转换上唯一myNumber计数。

并考虑GROUP BY如果您需要计算每个唯一的mynumber。

SELECT [A_number] + '-' + CONVERT(VARCHAR(10),[zone]), COUNT(*) 
FROM [dbo].[soils] 
GROUP BY [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) 
+0

谢谢,但我需要计算每个唯一的mynumber而不是唯一的mynumber总数 – PeterTheGeo

+0

考虑'GROUP BY' – ydoow

0

要获得的myNumber每个值相关联的行数,沟DISTINCT并使用GROUP BY代替。

最简单的例子,重复表达在SELECT列表在GROUP BY子句:

SELECT [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) AS myNumber 
    , COUNT(*) AS cnt 
    FROM [dbo].[soils] 
GROUP 
    BY [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) 

对于琐碎套,性能将不会是一个问题。对于较大的套件,性能可能会受损。那里的解决方案是重做查询以利用现有索引,或添加适当的索引。

+0

@JRLambert:你说得对。 DOH!完全错过了COUNT(*)聚合。现在修复。我也可以选择使用'SUM(1)AS cnt' – spencer7593