如何编写sql select以获取百分比

时间:2014-08-14 14:00:34

标签: sql-server select percentage

我定义了一个包含2列的视图

France    Wine 
France    Fromage
France    Meat
France    Chips
Belgium   Bier
Belgium   Chips  
Belgium   Chocolate

我喜欢Bier和Chips 选择以获得最佳国家 像

Belgium 66%
France  25%

2 个答案:

答案 0 :(得分:3)

您希望每个国家/地区的Bier和Chips计数除以每个国家/地区的总项目数。

Bier和Chips的计数如下:

COUNT(CASE WHEN Item IN ('Bier', 'Chips') THEN 1 END)

如果Item是Bier或Chips,则CASE会返回1,这会被计算在内。如果它不是Bier或Chips,则CASE返回NULL,不计算。

全部放在一起:

SELECT
  Country,
      COUNT(CASE WHEN Item IN ('Bier', 'Chips') THEN 1 END) /
      CAST(COUNT(*) AS NUMERIC)
    AS BierChipsPercent
FROM myTable
GROUP BY Country

为什么CAST(COUNT(*) AS NUMERIC)?因为没有它,SQL Server似乎将两个COUNT都视为整数,因此当它们被分割时它会截断结果。转换为NUMERIC使其表现良好,因此1/4将产生0.25而不是零。

以上查询将为您提供:

Belgium 0.6666666666
France  0.25

要获得百分比,只需乘以100.要获得整数,请应用ROUND()函数:

SELECT
  Country,
  ROUND(
      COUNT(CASE WHEN Item IN ('Bier', 'Chips') THEN 1 END) /
      CAST(COUNT(*) AS NUMERIC) * 100, 0)
    AS BierChipsPercent
FROM myTable
GROUP BY Country

这会给你:

Belgium 67
France  25

请注意,比利时的百分比最高为67.如果您希望它为66,请使用FLOOR代替ROUND

这个here有一个SQL小提琴。

答案 1 :(得分:0)

这是我的选择,但我明白我也可以用over()???

SELECT  c1 ,
convert(
        decimal(5,2),
        100.00 * 
        (select COUNT(*) from myTable WHERE c1=t.c1 and (c2='Chips' or c2='Bier')) 
        /
        (SELECT count(*) FROM myTable WHERE c1=t.c1)
        ) AS percentage

  FROM myTable t
  group by c1

 c1         percentage
 Belgium    66.67
 France     25.00