通过应用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