获取每列的百分比值 [英] Getting percentage value for each column

查看:66
本文介绍了获取每列的百分比值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

**样本数据:**

 LINE_NO E_FIELD F_FIELD G_FIELD HSA_STATUS家庭CACHE_FAMILY计数百分比

23053B 00000 00000 00000 S峰会43 ??
23053B 00000 00000 00000 T SUMMIT WER 144 ??
23053B 00000 00000 00684 T SUMMIT WER 2 ??
23053B 00353 00418 00684 T SUMMIT WER 1 ??
23053B 00353 00418 00763 T SUMMIT WER 1 ??
23053B 00353 00418 01512 T SUMMIT WER 1 ??
23053B 00353 00418 06797 T SUMMIT WER 1 ??
23053B 00353 00418 30228 T SUMMIT WER 1 ??
23053B 00353 00418 31935 T SUMMIT WER 2 ??
23053B 05601 01402 00758 T SUMMIT WER 1 ??
23053B 05601 01402 09091 T SUMMIT WER 1 ??
23053B 05601 01402 65053 T SUMMIT WER 1 ??
---------------------------------------------- ---------------------
23054B 00000 00000 00000 S SUMMIT WER 37 ??
23054B 00000 00000 00000 T SUMMIT WER 96 ??
23054B 00353 00418 00758 T SUMMIT WER 1 ??
23054B 00354 00414 01095 T SUMMIT WER 1 ??



这是我的查询:

  SELECT  LINE_NO,
E_FIELD,
F_FIELD,
G_FIELD,
HSA_STATUS,
FAMILY,
CACHE_FAMILY,
计数=((SUM(TOTAL) )))
FROM

SELECT LINE_NO,
E_FIELD,
F_FIELD,G_FIELD,
HSA_STATUS,
FAMILY,
CACHE_FAMILY,
计数(LINE_NO) as 总计
FROM TX_HSA_SUMM
WHERE MT_TIMESTAMP2 BETWEEN ' 2013-03-07 10:10:00' AND ' 2013-03-08 10:20 :00'
GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY
as a
GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS ,FAMILY,CACHE_FAMILY,总计
ORDER BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS, FAMILY,CACHE_FAMILY,总计



这实际上是我的样本数据。我已经计算了。正如您可以看到列标题。我的问题是我需要总结计数和每行所需的百分比。例如,上述记录的总数为** 199 **,因此第一个记录计数为** 43 **,因此计算结果应为** 43/199 * 100 **。如何查看百分比? ?? ??获得百分比的平均值。请帮助我,我迫切需要这个。只应该在破折号之后的那条特定的生产线上进行新的生产线,否则在计算百分比时,它应该只计算特定的生产线没有计数并获得百分比。



是否有任何建议可以显示如何获得计数。然后从那个总和计数到最后。计数应除以总和和* 100得到百分比。



25-3-2013今天所做的更改是:

我设法准备百分比。有没有想法如何根据不同的行号进行分区,并且计数值应该按顺序排列。谢谢

解决方案





检查脚本...你会直接写没有GROUP BY子句的SELECT语句...



  DECLARE  < span class =code-sdkkeyword> @ TX_HSA_SUMM   TABLE (LINE_NO  VARCHAR  20 ),E_FIELD  VARCHAR  20 ),F_FIELD  VARCHAR  20 ),G_FIELD  VARCHAR  20 ),HSA_STATUS  CHAR  1 ) ,FAMILY  VARCHAR  20 ),
CACHE_FAMILY VARCHAR 20 ),Count INT

INSERT INTO @TX_HSA_SUMM (LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,Count)
SELECT ' 23053B'' 00000'' 00000' ' 00000'' S'' SUMMIT'' WER' 43
UNION ALL
SELECT ' 23053B'' 00000'' 00000'' 00000'' T' ' SUMMIT'' WER' 144
UNION ALL
SELECT ' 23053B'' 00000'' 00000'' 00684'' T'' SUMMIT'' WER' 2
UNION ALL
SELECT ' 23053B'' 00353'' 00418'' 00684'' T'' SUMMIT'' WER' 1
UNION ALL
SELECT ' 23053B'' 00353'' 00418'' 00763'' T' ' SUMMIT'' WER' 1
UNION ALL
SELECT ' 23053B'' 00353'' 00418'' 01512'' T'' SUMMIT'' WER' 1
UNION ALL
SELECT ' 23053B'' 00353'' 00418'' 06797'' T'' SUMMIT'' WER' 1
UNION ALL
SELECT ' 23053B'' 00353'' 00418'' 30228'' < span class =code-string> T',' SUMMIT'' WER' 1
< span class =code-keyword> UNION ALL
SELECT ' 23053B'' 00353'' 00418'' 31935'' T'' SUMMIT'' WER' 2
UNION ALL
SELECT ' 23053B'' 05601'' 01402'' 00758'' T'' SUMMIT'' WER' 1
UNION 所有
SELECT ' 23053B'' 05601'' 01402'' 09091'' T'' SUMMIT'' WER' 1
UNION ALL
SELECT ' 23053B'' 05601'' 01402'' 65053'' T'' SUMMIT'' WER ' 1

SELECT LINE_NO,E_FIELD,F_FIELD, G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,Count FROM @ TX_HSA_SUMM

SELECT LINE_NO,
E_FIELD,
F_FIELD,G_FIELD,
HSA_STATUS,
FAMILY,
CACHE_FAMILY,
CAST(ROUND(((Count / T.SumofCount)* 100. 00 ), 2 )< span class =code-keyword> AS NUMERIC 10 2 ))' 百分比
FROM @ TX_HSA_SUMM
INNER JOIN SELECT SUM(Count)* < span class =code-digit> 1 。 0 ' SumofCount'
FROM @ TX_HSA_SUMM
WHERE MT_TIMESTAMP2 BETWEEN ' 2013-03-07 10:10:00' AND ' 2013-03-08 10:20:00'
)T ON 1 = 1
WHERE MT_TIMESTAMP2 BETWEEN ' 2013-03-07 10:10:00' AND ' 2013-03-08 10:20:00'



问候,

GVPrabu


你需要这样的东西:

  SELECT  t1.LINE_NO,t1.E_FIELD,t1.F_FIELD,t1.G_FIELD,t1.HSA_STATUS,t1.FAMILY,t1.CACHE_FAMILY,SUM (t1.TOTAL) AS  CountOfLineNo,t2.TotalOfLineNo,(SUM(t1.TOTAL)/ t2.TotalOfLineNo *  100  AS 百分比
FROM
SELECT LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,Count(LINE_NO) 总计
FROM TX_HSA_SUMM
WHERE MT_TIMESTAMP2 BETWEEN ' 2013-03-07 10:10:00' AND ' 2013-03-08 10:20:00'
GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY
AS t1 LEFT JOIN
SELECT LINE_NO,COUNT(LINE_NO) AS TotalOfLineNo
FROM TX_HSA_SUMM
WHERE MT_TIMESTAMP2 BETWEEN ' 2013-03-07 10:10 :00' AND ' 2013-03-08 10:20 :00'
AS t2 ON t1.LINE_NO = t2。 LINE_NO
GROUP BY t1.LINE_NO,t1.E_FIELD,t1.F_FIELD,t1.G_FIELD ,t1.HSA_STATUS,t1.FAMILY,t1.CACHE_FAMILY,t1.Total
ORDER BY t1.LINE_NO,t1.E_FIELD,t1.F_FIELD,t1.G_FIELD,t1.HSA_STATUS,t1.FAMILY,t1.CACHE_FAMILY,t1.Total



可能,你'需要 CONVERT / CAST [ ^ ]百分比列到预期格式。


试试这个:

  SELECT  
B. *
,百分比=计数* 100. 0 / SUM(计数) OVER PARTITION BY 1
FROM

SELECT LINE_NO,
E_FIELD,
F_FIELD,
G_FIELD,
HSA_STATUS,
FAMILY,
CACHE_FAMILY,
Count =((SUM(TOTAL)))
FROM

SELECT LINE_NO,
E_FIELD,
F_FIELD,G_FIELD,
HSA_STATUS,
FAMILY,
CACHE_FAMILY,
Count(LINE_NO) as 总计
FROM TX_HSA_SUMM
WHERE MT_TIMESTAMP2 BETWEEN ' 2013-03-07 10:10:00' AND ' 2013-03-08 10:20: 00'
GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS ,FAMILY,CACHE_FAMILY
as a
GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,总计
B
< span class =code-keyword> ORDER BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,Count


**Sample data :**

LINE_NO E_FIELD F_FIELD G_FIELD HSA_STATUS FAMILY CACHE_FAMILY Count  Percentage 

    23053B 00000 00000 00000 S         SUMMIT     WER           43   ??
    23053B 00000 00000 00000 T         SUMMIT     WER           144  ??
    23053B 00000 00000 00684 T         SUMMIT     WER           2    ??
    23053B 00353 00418 00684 T         SUMMIT     WER           1    ??
    23053B 00353 00418 00763 T         SUMMIT     WER           1    ??
    23053B 00353 00418 01512 T         SUMMIT     WER           1    ??
    23053B 00353 00418 06797 T         SUMMIT     WER           1    ??
    23053B 00353 00418 30228 T         SUMMIT     WER           1    ??
    23053B 00353 00418 31935 T         SUMMIT     WER           2    ??
    23053B 05601 01402 00758 T         SUMMIT     WER           1    ??
    23053B 05601 01402 09091 T         SUMMIT     WER           1    ??
    23053B 05601 01402 65053 T         SUMMIT     WER           1    ??
    -------------------------------------------------------------------
    23054B 00000 00000 00000 S        SUMMIT      WER           37   ?? 
    23054B 00000 00000 00000 T        SUMMIT      WER           96   ?? 
    23054B 00353 00418 00758 T        SUMMIT      WER           1    ?? 
    23054B 00354 00414 01095 T         SUMMIT     WER           1    ?? 


This is my query:

SELECT LINE_NO,
    E_FIELD,
    F_FIELD,
    G_FIELD,
    HSA_STATUS,
    FAMILY,
    CACHE_FAMILY,
    Count = ((SUM(TOTAL)) )  
FROM
    (
      SELECT LINE_NO,
        E_FIELD,
        F_FIELD,G_FIELD,
        HSA_STATUS,
        FAMILY,
        CACHE_FAMILY, 
        Count(LINE_NO) as Total 
      FROM TX_HSA_SUMM 
      WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00') AND ('2013-03-08 10:20:00') 
      GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY
    ) as a
    GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,total
    ORDER BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,total


This is my sample data actually. I already make the count. As You can see the column header. My problem is I need to sum the count and the for each row I need to get the percentage. For example the total for the above record is **199** so for the first record count is **43** so the calculation should be **43/199 * 100**. How can I view the percentage? The ?? mean column to get percentage. Please help me I need this urgently.it should be done only for that particular line line after the dash its a new line no so when calculating the percentage it should count only that particular line no count and get the percentage.

Is there any suggestion to show how to get the count first. then from that sum the count and finally. the count should be divided with the sum and * 100 to get percentage.

25-3-2013 changes made for today is:
I manage to get the percentage ready. Is there any idea how to do partition according with the different line number and the count value should be in desc order. Thanks

解决方案

Hi,

Check the script... U will write direct SELECT Statement with out GROUP BY Clause...

DECLARE @TX_HSA_SUMM  TABLE(LINE_NO VARCHAR(20), E_FIELD VARCHAR(20), F_FIELD VARCHAR(20), G_FIELD VARCHAR(20), HSA_STATUS CHAR(1), FAMILY VARCHAR(20),
CACHE_FAMILY VARCHAR(20), Count INT)
 
INSERT INTO @TX_HSA_SUMM(LINE_NO, E_FIELD, F_FIELD, G_FIELD, HSA_STATUS, FAMILY, CACHE_FAMILY, Count)
SELECT '23053B','00000','00000','00000','S','SUMMIT','WER',43
UNION ALL
SELECT '23053B','00000','00000','00000','T','SUMMIT','WER',144
UNION ALL
SELECT '23053B','00000','00000','00684','T','SUMMIT','WER',2
UNION ALL
SELECT '23053B','00353','00418','00684','T','SUMMIT','WER',1
UNION ALL
SELECT '23053B','00353','00418','00763','T','SUMMIT','WER',1
UNION ALL
SELECT '23053B','00353','00418','01512','T','SUMMIT','WER',1
UNION ALL
SELECT '23053B','00353','00418','06797','T','SUMMIT','WER',1
UNION ALL
SELECT '23053B','00353','00418','30228','T','SUMMIT','WER',1
UNION ALL
SELECT '23053B','00353','00418','31935','T','SUMMIT','WER',2
UNION ALL
SELECT '23053B','05601','01402','00758','T','SUMMIT','WER',1
UNION ALL
SELECT '23053B','05601','01402','09091','T','SUMMIT','WER',1
UNION ALL
SELECT '23053B','05601','01402','65053','T','SUMMIT','WER',1

SELECT LINE_NO, E_FIELD, F_FIELD, G_FIELD, HSA_STATUS, FAMILY, CACHE_FAMILY, Count FROM @TX_HSA_SUMM

SELECT LINE_NO,
        E_FIELD,
        F_FIELD,G_FIELD,
        HSA_STATUS,
        FAMILY,
        CACHE_FAMILY, 
        CAST(ROUND(((Count/T.SumofCount) *100.00),2) AS NUMERIC(10,2)) 'Percentage'
FROM @TX_HSA_SUMM 
INNER JOIN (SELECT SUM(Count)* 1.0 'SumofCount' 
            FROM @TX_HSA_SUMM
            WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00') AND ('2013-03-08 10:20:00')
) T ON 1=1
WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00') AND ('2013-03-08 10:20:00') 


Regards,
GVPrabu


You need something like this:

SELECT t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, t1.FAMILY, t1.CACHE_FAMILY, SUM(t1.TOTAL) AS CountOfLineNo, t2.TotalOfLineNo, (SUM(t1.TOTAL) / t2.TotalOfLineNo * 100) AS Percentage
FROM (
      SELECT LINE_NO, E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY, Count(LINE_NO) as Total
      FROM TX_HSA_SUMM
      WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00' AND '2013-03-08 10:20:00')
      GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY
    ) AS t1 LEFT JOIN (
                      SELECT LINE_NO, COUNT(LINE_NO) AS TotalOfLineNo
                      FROM TX_HSA_SUMM
                      WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00' AND '2013-03-08 10:20:00')
                      ) AS t2 ON t1.LINE_NO = t2.LINE_NO
    GROUP BY t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, t1.FAMILY, t1.CACHE_FAMILY, t1.Total
    ORDER BY t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, t1.FAMILY, t1.CACHE_FAMILY, t1.Total


Probably, you''ll need to CONVERT/CAST[^] Percentage column to expected format.


Try this:

SELECT 
  B.*
, Percentage= Count *100.0 /SUM(Count) OVER (PARTITION BY 1)
FROM
(
SELECT LINE_NO,
    E_FIELD,
    F_FIELD,
    G_FIELD,
    HSA_STATUS,
    FAMILY,
    CACHE_FAMILY,
    Count = ((SUM(TOTAL)) )
FROM
    (
      SELECT LINE_NO,
        E_FIELD,
        F_FIELD,G_FIELD,
        HSA_STATUS,
        FAMILY,
        CACHE_FAMILY,
        Count(LINE_NO) as Total
      FROM TX_HSA_SUMM
      WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00') AND ('2013-03-08 10:20:00')
      GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY
    ) as a
    GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,total
)as B
 ORDER BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY,Count


这篇关于获取每列的百分比值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆