如何按字符串的一部分分组

时间:2016-05-31 09:47:39

标签: sql sql-server

如何按字符串的一部分对数据进行分组。

示例数据:

StringA ValueA ValueB
47353-1 123    1440
47353-2 235    9472
47353-3  44     439
47355-1  21     482

想要的结果:

StringA Count SumA SumB
47353       3  402 11351 
47355       1   21   482

如果我使用Group by StringA,则会出错。

3 个答案:

答案 0 :(得分:1)

派生表格版本。非常方便地避免两次输入复杂聚合函数:

select StringA, count(*), sum(ValueA) SumA, sum(ValueB) SumB
from
(
    select left(StringA, 5) StringA, ValueA, ValueB
    from tablename
)
group by StringA

ANSI SQL兼容! (LEFT除外,应为substring(StringA from 1 for 5)。)

答案 1 :(得分:0)

< p>使用带有CHARINDEX的左侧给出这个(测试数据),这将允许在必要时使用不同的长度字段。< / p> < p>用于测试的数据;< / p> < pre>< code> CREATE TABLE #TableName(StringA varchar(10),ValueA int,ValueB int) INSERT INTO #TableName(StringA,ValueA,ValueB) VALUES (' 47353-1',123,1440) ,(' 47353-2',235,9472) ,(' 47353-3',44439) ,(' 47355-1',21482) < /代码>< /预> < p>实际查询;< / p> <预><代码> SELECT     LEFT(StringA,CHARINDEX(' - ',StringA,0)-1)StringA     ,COUNT(StringA)计数     ,SUM(ValueA)SumA     ,SUM(ValueB)SumB 从     #TableName 通过...分组     LEFT(StringA,CHARINDEX(' - ',StringA,0)-1) < /代码>< /预> &LT p为H.;结果< / p为H. < pre>< code> StringA Count SumA SumB 47353 3 402 11351 47355 1 21 482 < /代码>< /预> < p>并且不要忘记;< / p> < pre>< code> DROP TABLE #TableName < /代码>< /预>

答案 2 :(得分:0)

以下查询将提供所需的输出: -

select distinct substring(stringA,1,charindex('-',StringA)-1) StringA, 
Count(StringA) over (partition by substring(stringA,1,charindex('-',StringA)-1)) Count, 
sum(ValueA) over (partition by substring(stringA,1,charindex('-',StringA)-1)) SumA, 
sum(ValueB) over (partition by substring(stringA,1,charindex('-',StringA)-1)) SumB 
from test

输出: -

StringA   Count   SumA   SumB
 47353      3      402   11351 
 47355      1       21     482