我定义了一个包含2列的视图
France Wine
France Fromage
France Meat
France Chips
Belgium Bier
Belgium Chips
Belgium Chocolate
我喜欢Bier和Chips 选择以获得最佳国家 像
Belgium 66%
France 25%
答案 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