SQL Server如何获取列中唯一值的数量和每个值的平均分数?

SQL Server如何获取列中唯一值的数量和每个值的平均分数?,sql,sql-server,count,average,Sql,Sql Server,Count,Average,我有一张这样的桌子 city metric_name metric_value id Berlin likes 1 1a Berlin dislikes 2 1a Berlin comments 3 1a Berlin likes 4 1b Ber

我有一张这样的桌子

city        metric_name      metric_value   id
Berlin      likes            1              1a
Berlin      dislikes         2              1a 
Berlin      comments         3              1a

Berlin      likes            4              1b
Berlin      dislikes         5              1b
Berlin      comments         3              1b

Hamburg     likes            1              1c
Hamburg     dislikes         2              1c
Hamburg     comments         3              1c

Hamburg     likes            2              1d
Hamburg     dislikes         4              1d
Hamburg     comments         5              1d
等等

My ideal result is this

city        city_count_unique   average_metric_score
Berlin      2                   3 (sum metric_value / sum metric_names)
Hamburg     2                   2,8
我所做的

我得到了每个城市的不同计数和平均度量值

SELECT AVG(T.metric_value), T.city,
COUNT(*) AS 'city_count_unique'
FROM 
    (SELECT DISTINCT metric_value, city
    FROM dbo.Table) as T
GROUP BY T.city
但这是错误的

谢谢你的帮助

更新
另外还有一个varchar格式的列id,这里的答案取决于以下假设:

每个“组”(即喜欢、不喜欢)都有3个度量 (附件和评论)

如果该假设是正确的,则以下内容将输出您要查找的内容:

SELECT  city,
        COUNT(metric_name) / 3 AS city_count_unique,
        CAST(SUM(metric_value) AS FLOAT) / COUNT(metric_value) AS average_metric_score
  FROM  #Table
  GROUP BY city
输出:

city    city_count_unique   average_metric_score
Berlin  2                   3
Hamburg 2                   2.83333333333333
这是如何工作的?

通过按城市分组,我们将每个城市的结果分别合并

metric\u name
的计数给出了该城市的总指标(在您的示例中为6)。我将其除以3,得到唯一计数(基于我所述的假设)

如果每个城市的
度量值的总和除以度量值的数量,则计算
平均度量值得分
(柏林为18/6)。将
转换为浮点的原因是允许浮点答案。如果您喜欢使用
CONVERT
而不是
CAST
,也可以使用
CONVERT

在OP更新后编辑问题

OP编辑了该问题,以指示存在允许检测度量分组的ID列。这是一个更新,使用它,而不是假设每个组总是有3个指标

SELECT  city,
        COUNT(id) AS city_count_unique,
        CAST(SUM(metric_value_total) AS FLOAT) / SUM(metric_value_count) AS average_metric_score
  FROM  (
        SELECT  city,
                id,
                SUM(metric_value) metric_value_total,
                COUNT(metric_value) AS metric_value_count
          FROM  #Table
          GROUP BY city, id
        ) a
  GROUP BY city
你似乎想要:

SELECT city,
       COUNT(DISTINCT id) as city_count_unique,
       AVG(metric_value * 1.0) as average_metric_score
FROM t
GROUP BY city;

您好,不幸的是,度量的数量可能会有所不同(@AnnaDmitrieva在这种情况下,你怎么知道有多少?有没有办法计算它?我更新了问题,有一个id列,就像我必须计算每个城市的id一样,但从来没有使用过SQL,不知道如何将所有的id组合在一起view@AnnaDmitrieva我已经根据你提供的新信息更新了答案