获取COUNT()行,其中列的前3位数字相似

时间:2014-07-29 20:28:13

标签: sql-server tsql count

我有一组代码,通常是三位数,后跟最多2位数,例如012.34123.45。前三个数字定义组的一般类别,小数点后面的数字定义更具体的质量。可能有77个012.xx个数字,并且有数百个唯一的3位数组定义,每个条目的数字位数不同。

有谁知道如何编写快速查询来实现这一目标?

4 个答案:

答案 0 :(得分:2)

假设它存储在varchar列中,因为您要存储012.34 ...

SELECT LEFT(someColumn,3), COUNT(*)
FROM someTable
GROUP BY LEFT(someColumn,3)
HAVING COUNT(*) > 5 -- per your comments
ORDER BY LEFT(someColumn,3)

如果不是,那么你会这样做:

SELECT LEFT(CONVERT(VARCHAR(10),someColumn),3), COUNT(*)
FROM someTable
GROUP BY LEFT(CONVERT(VARCHAR(10),someColumn),3)
ORDER BY LEFT(CONVERT(VARCHAR(10),someColumn),3)

答案 1 :(得分:0)

取决于您的结果集是数字还是字符。如果不是数字,你可以使用字符串操作。

 select left(resultSet,charindex('.',resultset)) , count(*)
   from x 
     group by by left(resultSet,charindex('.',resultset))
     order by left(resultSet,charindex('.',resultset)) 

使用charindex,您将获得正确的剪切'当第一个数字不是3时,通常是'。

如果你的结果集是数字/浮点数你可以使用地板函数

select floor(resultset),count(*)
 from x
   group by floor(resultset)
   order by floor(resultset)

答案 2 :(得分:0)

@rypress看起来与Other respiratory tuberculosis ClickMe的ICD-9诊断代码非常相似。它是否正确?在这种情况下,您将在结果中获得类别和子类别,并可能会更改您的计数(012->012.0->012.00,012.02..)

示例数据:

IF OBJECT_ID(N'TempICD') > 0
    BEGIN
       DROP TABLE TempICD
    END

CREATE TABLE TempICD (ICD VARCHAR(10))

INSERT INTO TempICD
VALUES ('012'),('012.0'),('012.00'),('012.01'),('012.02'),
      ('012.03'),('012.04'),('012.05'),('012.05'),
      ('013'),('013.0'),('013.00'),('013.01'),('013.02'),
      ('013.03'),(NULL)

查询以获取包含6个或更多订单项的类别(包括类别和子类别):

SELECT LEFT(ICD, 3) AS ICDs,
      COUNT(1) AS ICDCount
FROM TempICD
GROUP BY LEFT(ICD, 3)
HAVING COUNT(*) > 5
ORDER BY LEFT(ICD, 3)

查询以获取包含6个或更多订单项的类别(不包括类别和子类别):

SELECT SUBSTRING(ICD, 1, CHARINDEX('.', ICD + '.') - 1) AS ICDs,
      SUM(CASE
         WHEN LEN(SUBSTRING(ICD, CHARINDEX('.', ICD) + 1, LEN(ICD))) = 2 THEN 1
         ELSE 0
         END) AS ICDCount
FROM TempICD
WHERE ICD IS NOT NULL
GROUP BY SUBSTRING(ICD, 1, CHARINDEX('.', ICD + '.') - 1)
HAVING SUM(CASE
         WHEN LEN(SUBSTRING(ICD, CHARINDEX('.', ICD) + 1, LEN(ICD))) = 2 THEN 1
         ELSE 0
         END) > 5

清理脚本:

IF OBJECT_ID(N'TempICD') > 0
    BEGIN
       DROP TABLE TempICD
    END

答案 3 :(得分:0)

这也可以帮到你。 我假设该列是十进制数据类型。

SELECT  CAST([COLUMN] AS INT) [GROUP],
        COUNT(*) [COUNT]
FROM    [TABLE] T
GROUP BY CAST([COLUMN] AS INT)