2012-07-11 160 views
1

我想使用子查询的结果作为外部查询的派生表,然后对来自子查询的信息进行计数和分组。这是我的SQL知识的一部分,尽管在线查看了多个示例,但我没有得到正确的语法。使用case语句嵌套sql查询

子查询:

SELECT rname.rn_country AS country, rname.rn_index AS id, sum(rresults.rr_sec_total) AS time 
FROM rname 
INNER JOIN rresults AS rresults ON rname.rn_index = rresults.rr_rn_index 
WHERE  rn_view = 'true' 
    AND rr_date = '6/6/2012' 
    AND (rr_slide = 'standard' OR rr_slide = 'water') 
GROUP BY rn_index, rn_country 
HAVING SUM (rresults.rr_sec_total) >= 18000 

的这此结果是:

 
country id  time 
CAN  19700 57600 
USA  451294 144600.9 
USA  901260 39601.8 
USA  934270 109800 
DEN  913601 31800 
USA  915011 108720.9

我然后需要做的就是算ID的数量,其中(时间> = 18000和时间< = 36000)是铜牌,(时间> = 36000和< = 54000)是白银,时间> 54000是黄金,按国家分组。因此,基于上述值的结果,最终的结果将是:

CAN:1个黄金
DEN:1个铜
美国:3金1银

鉴于此,有哪些呢完整的查询需要?提前致谢。任何帮助赞赏。

+0

如果时间正好是'36000',就会算作两个铜牌和银牌。这是你的意思,还是你的意思是为青铜器设置时间<36000?另外,你使用的是什么DBMS? – 2012-07-11 22:09:23

回答

1

为什么不给各列的计数,像这样:

SELECT 
    a.country, 
    COUNT(CASE WHEN a.time > 54000 THEN 1 END) AS num_gold, 
    COUNT(CASE WHEN a.time BETWEEN 36000 AND 54000 THEN 1 END) AS num_silver, 
    COUNT(CASE WHEN a.time BETWEEN 18000 AND 36000 THEN 1 END) AS num_bronze 
FROM 
(
    SELECT rname.rn_country AS country, rname.rn_index AS id, sum(rresults.rr_sec_total) AS time 
    FROM rname 
    INNER JOIN rresults AS rresults ON rname.rn_index = rresults.rr_rn_index 
    WHERE rn_view='true' AND rr_date='6/6/2012' AND (rr_slide='standard' OR rr_slide='water') 
    GROUP BY rn_index, rn_country having sum(rresults.rr_sec_total) >= 18000 
) a 
GROUP BY a.country 
+0

这很完美!谢谢你,赞恩! – user1467223 2012-07-11 23:44:07

+0

@ user1467223,太棒了!很高兴听到它的作品。如果您发现我的解决方案有帮助,请将其标记为已接受。谢谢! – 2012-07-12 01:18:43