SQL Help:复杂查询

时间:2013-05-31 05:57:21

标签: sql

table : metrics

列:

1. name : Name
2. instance: A name can have several instances 
(Name: John, Instances: John at work, John at concert)
3. metric: IQ, KQ, EQ
4. metric_value: Any numeric

查询目标

找出所有名称的所有实例的metric_value为0的指标。

数据的性质

名称的指标' M'例如' X'可能是10.但是对于相同的名称和相同的度量标准实例' Y'可能是0。在这种情况下,' M'不应该退还。

编辑: 样本数据:

NAME    INSTANCE    METRIC  VALUE
John    At work         IQ  0
John    At home         EQ  10
John    At a concert    KQ  0
Jim At work         IQ  0
Jim At home         KQ  0
Tina    At home         IQ  100
Tina    At work         EQ  0
Tina    At work         KQ  0

在这种情况下,只应返回KQ,因为对于所有名称及其实例,它始终为零。

4 个答案:

答案 0 :(得分:0)

基于您的数据的列表:

SELECT name, metric FROM metrics GROUP BY name, metric HAVING SUM(metric_value) = 0

答案 1 :(得分:0)

你在找这样的东西吗?

SELECT metric
  FROM metrics
 GROUP BY metric
HAVING SUM(metric_value) = 0

这是 SQLFiddle 演示

更新如果metric_value可以有负值,那么请使用此值

SELECT metric
  FROM metrics
 GROUP BY metric
HAVING SUM(ABS(metric_value)) = 0

此处已更新 SQLFiddle 演示

答案 2 :(得分:0)

即使这看起来像家庭作业一样......看看这能给你带来什么:

SELECT DISTINCT M1.Metric
FROM METRICS M1
WHERE NOT EXISTS (
    SELECT * FROM METRICS M2 
    WHERE M2.Metric <> 0
    AND M1.Metric = M2.Metric
)

答案 3 :(得分:0)

大多数其他答案都假设metric是正面的。 OP表示它可以是任何数字。以下是两种方法。

检查绝对值的总和:

SELECT metric
FROM metrics
GROUP BY metric
HAVING SUM(abs(metric_value)) = 0

明确检查没有非零值:

SELECT metric
FROM metrics
GROUP BY metric
HAVING SUM(case when metric_value <> 0 and metric_value is not null then 1 else 0 end) = 0