SQL练习的问题来自sql-ex

时间:2018-04-28 15:06:05

标签: sql

我有一个数据库"绘画",它由3个表组成:

  • utQ(Q_ID int,Q_NAME varchar(35))
  • utV(V_ID int,V_NAME varchar(35),V_COLOR char(1))
  • utB(B_Q_ID int,B_V_ID int,B_VOL tinyint,B_DATETIME datetime)。

utQ表包含正方形的标识符和名称,其初始颜色为黑色。 (注意:黑色不是颜色,被认为是未上漆的。只有红色,绿色和蓝色是颜色。) utV表包含喷雾罐的标识符和名称以及它们填充的油漆颜色。 utB表包含有关喷涂方块的信息,包含方形和喷涂罐标识符,所应用的涂料数量以及喷涂事件的时间。

应该注意

  • 喷雾罐可能含有三种颜色中的一种颜色:红色(V_COLOR =' R'),绿色(V_COLOR =' G')或蓝色(V_COLOR =&# 39; B&#39);
    • 任何喷雾最初可包含255单位的涂料;
    • 方形颜色根据RGB模型定义,即R = 0,G = 0,B = 0是黑色,而R = 255,G = 255,B = 255是白色;
    • utB表中的任何记录都会减少相应喷涂罐中的涂料量B_VOL,从而相应地增加涂在方块上的涂料量;
    • B_VOL必须大于0且小于或等于255;
    • 应用于一个方格的单色涂料量不能超过255,喷涂罐中的涂料量不能少于零;
    • 绘制事件的时间(B_DATETIME)以一秒精度指定,即它不包含毫秒;
    • 由于历史原因,许多练习都将喷雾罐称为“气球”,而utV表包含喷雾罐名称(V_NAME栏),如“气球#01”等。

这是架构

enter image description here

问题是

  

黑色方块的最大数量可以用涂料剩余部分涂成白色吗?

我的解决方案如下:

SELECT TOP 1 SUM(t.rest) / 255 tot_rest FROM

   (SELECT V_ID, 
            V_COLOR, 
             COALESCE(255-SUM(B_VOL), 255) rest 
   FROM utV LEFT JOIN utB ON utV.V_ID = utB.B_V_ID 
   GROUP BY V_ID, V_COLOR 
   HAVING COALESCE(255-SUM(B_VOL), 255) != 0) t 

GROUP BY t.v_color 
ORDER BY SUM(t.rest) / 255

不幸的是,它没有通过所有测试。你能帮助我,我做错了吗? (所有"解决方案"此练习,我发现,也没有通过所有测试)

非常感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:0)

问题是我的查询在数据库中缺少至少一种颜色时没有考虑这种情况。例如,如果utV中没有记录,而红色喷涂罐没有utB,则正确的查询应该返回0,但是我的查询会返回一些数字。

正确的查询是:

    SELECT CASE WHEN COUNT(*) = 3 then MIN(t1.tot_rest) ELSE 0 END
    FROM
        (SELECT SUM(t.rest) / 255 tot_rest FROM
             (SELECT V_ID, 
                V_COLOR, 
                 COALESCE(255-SUM(B_VOL), 255) rest 
       FROM utV LEFT JOIN utB ON utV.V_ID = utB.B_V_ID 
       GROUP BY V_ID, V_COLOR) t 

    GROUP BY t.v_color) t1