SQL-EX.ru查询问题集#28

Tor*_*ser 3 sql t-sql

我正在尝试编写一个SQL查询来解决www.sql-ex.ru(问题28)中的问题,我得到了正确的结果,但我收到此错误"您的查询在第三个检查数据库上失败了."

SQL查询问题:

要在两位小数之内,定义每平方的平均涂料量.

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 ='B');
  • 任何气球最初都是满的,体积为255;
  • 方形颜色根据RGB规则定义,即R = 0,G = 0,B = 0是黑色,而R = 255,G = 255,B = 255是白色;
  • 表格中的任何记录utB都会通过B_VOL减少气球中的涂料数量,并将正方形中的涂料数量增加相同的值;
  • B_VOL必须大于0且小于或等于255;
  • 一个方格中相同颜色的涂料量不得超过255;
  • 气球中的油漆量不得小于0;
  • 绘画时间(B_DATETIME)在一秒内给出,即它不包含毫秒.

方案

方案

我的守则

WITH x AS (SELECT b_q_id, b_v_id, ball.v_color, b_vol as vol FROM utb
JOIN utv ball
ON utb.b_v_id = ball.v_id)
, y AS (
SELECT b_q_id, v_color, totalcolor = CASE WHEN SUM(vol) > 255 THEN 255
ELSE SUM(vol) END FROM x
GROUP BY b_q_id, v_color),
z AS(
SELECT b_v_id, totalbcolor = 
CASE WHEN SUM(b_vol) > 255 THEN 255
ELSE SUM(b_vol)
END
FROM utb
GROUP BY b_v_id)
, a AS
(SELECT b_q_id, SUM(totalcolor) totalacolor FROM y GROUP BY b_q_id)
, b AS 
(SELECT b_q_id,b_v_id, totalacolor FROM a, z)
, c AS
(SELECT DISTINCT b.b_q_id, totalacolor FROM b
INNER JOIN utb
ON (b.b_q_id = utb.b_q_id AND b.b_v_id = utb.b_v_id))

SELECT 
CAST(CAST(SUM(totalacolor) AS NUMERIC(8,2)) 
/ (SELECT COUNT(*) FROM utq)AS NUMERIC(8,2))  
 FROM c
Run Code Online (Sandbox Code Playgroud)

正确答案

386.25

评论 我的代码可能过长.但是,可能有一种更短的方式.但是,我仍然没有得到我错的地方.请帮忙.

Vas*_*zha 5

在这里你的代码)

SELECT  CONVERT(NUMERIC(15,2),SUM(COALESCE(UB.B_VOL,0)) / CONVERT(FLOAT,COUNT(DISTINCT UQ.Q_ID)))
FROM    utQ AS UQ
        LEFT JOIN utB AS UB ON UQ.Q_ID = UB.B_Q_ID
        LEFT JOIN utV AS UV ON UB.B_V_ID = UV.V_ID
Run Code Online (Sandbox Code Playgroud)

测试如下

在此输入图像描述

  • 没有必要LEFT JOIN utV表. (2认同)
  • @DavidRefaeli`COALESCE`函数需要删除`null`(类似于`NULLIF`和`ISNULL`,但我因为习惯而使用它,并且它在其他`null`转换函数方面也有一些优点)以防万一当`UQ.Q_ID`和`UB.B_Q_ID`不匹配时.因此,如果这两个匹配的键不匹配,那么`COALESCE`将返回"0",并且对于下一次计算,这意味着每平方的平均涂料量将等于"0"(因为有关"涂料量"的数据) "表格'utB`中缺少某些正方形. (2认同)