在SQL中划分两列的计数

时间:2018-09-05 14:52:02

标签: sql sql-server tsql

我试图将两列与第二列作为不同的值。第二列数据在第一列中可以有多个值。所以我想计算第一列和第二列的不重复数,然后将第一列除以第二列即可得出o / p。现在,我们需要在第三列上对数据进行分组。

示例:

A   B   C
----------------
30  10  tomatoes
30  10  tomatoes
 5  10  tomatoes
20   5  Potatoes
20   5  Potatoes
40   5  Potatoes
10  15  Onions
40  15  Onions
20  15  Onions

寻找可能的解决方案。

下面是一个简单的尝试。我不确定这是正确的还是应该使用分区方式。任何帮助将不胜感激。

SELECT  
    C, 
    COUNT('A') AS A,  
    COUNT(DISTINCT 'B') AS B,
    ((COUNT('A')) / COUNT(DISTINCT 'B')) AS AB
FROM 
    [Table]
GROUP BY
    C
ORDER BY 
    C

2 个答案:

答案 0 :(得分:1)

在这里进行除法要小心。当您有计数时,您将拥有整数数学。因此,类似3/2的结果将为1,而不是1.5。我对样本数据进行了一些修改,以证明我的意思。我在输出中包括了这两个计算,所以可以有所不同。

declare @Something table
(
    A int
    , B int
    , C varchar(20)
)
insert @Something values
(30, 10, 'tomatoes')
, (30, 11, 'tomatoes')
, (5 , 10, 'tomatoes')
, (20, 5 , 'Potatoes')
, (20, 5 , 'Potatoes')
, (40, 5 , 'Potatoes')
, (10, 15, 'Onions')
, (40, 15, 'Onions')
, (20, 15, 'Onions')

select count(A)
    , count(distinct B)
    , count(A) / (count(distinct B) * 1.0) --multiplied by 1.0 to force division to use a decimal
    , count(A) / count(distinct B) --integer math
    , C
from @Something s
group by C

答案 1 :(得分:0)

您的查询逻辑是正确的,但包含一些错字:

应该是:

SELECT C, COUNT(A) AS A, COUNT(DISTINCT B) AS B,
       COUNT(A) / COUNT(DISTINCT B) AS AB
FROM [Table]
GROUP BY C
ORDER BY C;

您正在传递常量值count('A'),该常量值将不返回表中的行,而不返回列A的计数。