Sql 如何改进GROUPBY子句
我正在尝试使用以下SQL生成报告:Sql 如何改进GROUPBY子句,sql,sql-server,Sql,Sql Server,我正在尝试使用以下SQL生成报告: DECLARE @TOTALTRANS int SET @TOTALTRANS = (SELECT count(*) FROM log_table where answear is not null) SELECT answear = ISNULL(answear,'Totalization') , COUNT(*) as Qtd, CASE @TOTALTRANS WHEN 0 THEN '0%' ELSE CONCAT(CAST((
DECLARE @TOTALTRANS int
SET @TOTALTRANS = (SELECT count(*) FROM log_table where answear is not null)
SELECT
answear = ISNULL(answear,'Totalization') ,
COUNT(*) as Qtd,
CASE @TOTALTRANS
WHEN 0 THEN '0%'
ELSE CONCAT(CAST(((count(*) * 100.0 / @TOTALTRANS)) as decimal(5,2)), ' % ')
END as Porcent
FROM log_table
WHERE answear is not null
GROUP BY answear WITH ROLLUP
我得到了以下结果:
APPROVED 111111 1 0.58 %
APPROVED 444444 164 95.91 %
APPROVED 222222 1 0.58 %
APPROVED 333333 1 0.58 %
CANCELLED 4 2.34 %
Totalization 171 100.00 %
但我想得到这个结果:
APPROVED 167 97.66 %
CANCELLED 4 2.34 %
Totalization 171 100.00 %
怎么做?
甚至改进也是受欢迎的……我也在想,也许可以使用union来实现这一点……理想情况下,您应该将数据标准化,以划分为“已批准”和“111111”。如果做不到这一点,像这样的事情应该会让你接近:
DECLARE @TOTALTRANS int
SET @TOTALTRANS = (SELECT count(*) FROM log_table where answear is not null)
;WITH CleanedUp AS (
SELECT
CASE
WHEN Answear LIKE 'APPROVED %' THEN 'APPROVED'
ELSE Answear
END as Answear
FROM Log_Table
)
SELECT
answear = ISNULL(answear,'Totalization') ,
COUNT(*) as Qtd,
CASE @TOTALTRANS
WHEN 0 THEN '0%'
ELSE CONCAT(CAST(((count(*) * 100.0 / @TOTALTRANS)) as decimal(5,2)), ' % ')
END as Porcent
FROM CleanedUp
WHERE answear is not null
GROUP BY answear WITH ROLLUP
看起来您只需要
分组依据的第一个空格内的任何内容
:
SELECT (CASE WHEN answear IS NULL THEN 'Totalization'
ELSE LEFT(answear, CHARINDEX(' ', answear) - 1)
END) as Answear,
COUNT(*) as Qtd,
(CASE @TOTALTRANS
WHEN 0 THEN '0%'
ELSE CONCAT(CAST(((count(*) * 100.0 / @TOTALTRANS)) as decimal(5,2)), ' % ')
END) as Porcent
FROM log_table
WHERE answear is not null
GROUP BY LEFT(answear, CHARINDEX(' ', answear) - 1) WITH ROLLUP ;
此版本假定answear“APPROVED 111111”中有一个空格-此值是否来自一列?是,APPROVED+授权编号。