通过应用group by获取计数的SQL查询

通过应用group by获取计数的SQL查询,sql,sql-server,Sql,Sql Server,我想得到以下结果: 源表: Cnt A B 4 ABC YU/FGH 5 ABC YU/DFE 5 ABC KL 2 LKP BN/ER 4 JK RE 结果: Cnt A B 9 ABC YU 5 ABC KL 2 LKP BN 4 JK RE 在这里,我希望通过分组“B”来计算计数,并希望仅显示“B”记录,直到特殊字符/您可以使用子字符串获得字符串,直到“/” 针对Oracle的解决方案-substrB,0,instrB,“/”,1-1

我想得到以下结果:

源表:

Cnt  A    B
4   ABC YU/FGH
5   ABC YU/DFE
5   ABC KL
2   LKP BN/ER
4   JK  RE
结果:

Cnt  A  B
9   ABC YU
5   ABC KL
2   LKP BN
4   JK  RE

在这里,我希望通过分组“B”来计算计数,并希望仅显示“B”记录,直到特殊字符/

您可以使用子字符串获得字符串,直到“/”


针对Oracle的解决方案-substrB,0,instrB,“/”,1-1 B


基本上,您必须过滤掉/symbol后面的所有字符,然后应用SUM和groupby。你可以在下面看到。内部查询过滤掉不需要的字符串,外部查询通过以下方式进行求和和和分组:

您可以在此处看到此功能->


希望这有帮助

我建议您使用如下查询:

select 
    sum(Cnt) Cnt, 
    A, 
    left(B, charindex('/',B+'/',0)-1) B    -- Using `+'\'` will do the trick
from 
    t
group by 
    A, 
    left(B, charindex('/',B+'/',0)-1);

通过使用字符串和CharIndex函数

;WITH SourceTable(Cnt,A,B) AS
(
SELECT 4,'ABC','YU/FGH'UNION ALL
SELECT 5,'ABC','YU/DFE'UNION ALL
SELECT 5,'ABC','KL'  UNION ALL
SELECT 2,'LKP','BN/ER' UNION ALL
SELECT 4,'JK','RE'
)

SELECT SUM(Cnt) AS Cnt,A,CASE WHEN CHARINDEX('/',B) = 0 THEN B
                              ELSE SUBSTRING(B,0,CHARINDEX('/',B)) END AS [B] FROM SourceTable
GROUP BY A,CASE WHEN CHARINDEX('/',B) = 0 THEN B
                ELSE SUBSTRING(B,0,CHARINDEX('/',B)) END
ORDER BY Cnt DESC
请尝试此查询-

SELECT SUM(Cnt) AS [COUNT]
    ,A
    ,CASE 
        WHEN CHARINDEX('/', B) > 0
            THEN SUBSTRING(B, 1, (CHARINDEX('/', B) - 1))
        ELSE B
        END
FROM tblSample
GROUP BY A, B
ORDER BY A, B

伟大的到目前为止,您尝试了什么?您正在使用哪些dbms?是/始终是第三个字符吗?Sql server,否/随时都可以place@DanielShillcock:选择countcnt作为cnt,[A]当[B]像'YU%'时的case,然后当[B]像'KL%'时的'YU'case,然后当[B]像'BN%'时的'KL'case,然后当[B]像'RE%'时的'RE'else'Others'作为B从select*从select count*作为count,[A],[B],按[A]按计数排序的分区上的行数[B]desc AS RN从F组按[B],[A]AS M,其中RN@DanielShillcock请考虑下面的一个:选择CONTCNT作为CNT,当[B]像“Y%”时,当[B]像'KL% ','KL '时,当[b]像'BN% ',然后'BN '时[B]像'RE%'然后'RE'其他'Others'以B结尾,来自N组,由[A],[B]@Abcdf不客气!!如果这个答案帮助你解决了你的问题,请将它标记为答案,以便帮助其他偶然发现它的人!!!
;WITH SourceTable(Cnt,A,B) AS
(
SELECT 4,'ABC','YU/FGH'UNION ALL
SELECT 5,'ABC','YU/DFE'UNION ALL
SELECT 5,'ABC','KL'  UNION ALL
SELECT 2,'LKP','BN/ER' UNION ALL
SELECT 4,'JK','RE'
)

SELECT SUM(Cnt) AS Cnt,A,CASE WHEN CHARINDEX('/',B) = 0 THEN B
                              ELSE SUBSTRING(B,0,CHARINDEX('/',B)) END AS [B] FROM SourceTable
GROUP BY A,CASE WHEN CHARINDEX('/',B) = 0 THEN B
                ELSE SUBSTRING(B,0,CHARINDEX('/',B)) END
ORDER BY Cnt DESC
SELECT SUM(Cnt) AS [COUNT]
    ,A
    ,CASE 
        WHEN CHARINDEX('/', B) > 0
            THEN SUBSTRING(B, 1, (CHARINDEX('/', B) - 1))
        ELSE B
        END
FROM tblSample
GROUP BY A, B
ORDER BY A, B