计算SQL查询中前缀的匹配数

时间:2016-08-23 15:19:48

标签: sql sql-server

我在SQL服务器中有一个类似于下面的表,我想计算在数据列中使用特定前缀的唯一出现次数,例如" 21:00:00"

数据集:

+-------------------------+
|          data           |
+-------------------------+
| 21:00:00:24:ff:5e:3a:bd |
| 50:01:43:80:18:6b:2a:4c |
| 21:00:00:1b:32:0f:a7:54 |
| 10:00:00:90:fa:a8:da:2a |
+-------------------------+

所需的查询输出:

+----------+----------+----------+
| 21:00:00 | 50:01:43 | 10:00:00 |
+----------+----------+----------+
|        2 |        1 |        1 |
+----------+----------+----------+

我已经能够通过使用以下方式让查询一次计算一个前缀:

SELECT COUNT(DISTINCT wwpn) AS "21:00:00" FROM table WHERE wwpn LIKE '21:00:00%'

但是,我想计算多个前缀,如所需的查询输出所示。

3 个答案:

答案 0 :(得分:2)

我一直在等待有人做一个动态的支点(就像Matt在评论中所说的那样),但还没有人做过:(...我自己尝试过,这就是我管理的......

Query

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + LEFT(QUOTENAME(data), 9) + ']' 
        FROM DataTable
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
         (
            select LEFT(data, 8) as data, COUNT(*) as count
            from DataTable
            GROUP BY LEFT(data, 8)
        ) x
        pivot 
        (
            max(count)
            for data in (' + @cols + N')
        ) p '

exec sp_executesql @query;

Results:

10:00:00 | 21:00:00 | 50:01:43
---------|----------|---------
    1    |    2     |    1
---------|----------|---------

答案 1 :(得分:0)

如果您事先知道前缀,那么您可以做这样简单的事情;

创建测试数据;

CREATE TABLE #TestData (FieldName nvarchar(50))
INSERT INTO #TestData
VALUES
 ('21:00:00:24:ff:5e:3a:bd')
,('50:01:43:80:18:6b:2a:4c')
,('21:00:00:1b:32:0f:a7:54')
,('10:00:00:90:fa:a8:da:2a')

查询

SELECT
SUM(CASE WHEN FieldName LIKE '21:00:00%' THEN 1 ELSE 0 END) [21:00:00]
,SUM(CASE WHEN FieldName LIKE '50:01:43%' THEN 1 ELSE 0 END) [50:01:43]
,SUM(CASE WHEN FieldName LIKE '10:00:00%' THEN 1 ELSE 0 END) [10:00:00]
FROM #TestData

结果

21:00:00    50:01:43    10:00:00
2           1           1

答案 2 :(得分:0)

使用此查询:

SELECT LEFT([Data], 8) as prefix, count(*) as cnt
    FROM tableName
    GROUP BY LEFT([Data], 8);