簡體   English   中英

SQL-EX.ru查詢問題集#28

[英]SQL-EX.ru query problemset #28

我正在嘗試編寫一個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

正確答案

386.25

評論我的代碼可能過長。 但是,可能有一種更短的方式。 但是,我仍然沒有得到我錯的地方。 請幫忙。

在這里你的代碼)

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

測試如下

在此輸入圖像描述

如果你想和幫助主題一起使用,你可以使用這個查詢:

SELECT cast(SUM(case when UB.B_VOL IS NULL then 0 else UB.B_VOL end) /cast(COUNT(DISTINCT UQ.Q_ID) as float) as decimal(8,2))FROM utQ AS UQ
    LEFT JOIN utB AS UB ON UQ.Q_ID = UB.B_Q_ID

這是另一個解決方案,使用CASE WHEN ... THEN ... ELSE ... END

SELECT CONVERT(NUMERIC(15,2),
(
SELECT SUM(total_paint) * 1.0 / COUNT(Q_ID) AS avg_paint 
FROM
(
SELECT DISTINCT utQ.Q_ID, 
CASE
WHEN SUM(B_VOL) IS NULL
THEN 0
ELSE SUM(B_VOL)
END
AS total_paint
FROM utQ
LEFT JOIN utB ON utB.B_Q_ID = utQ.Q_ID
GROUP BY utQ.Q_ID
) AS tmp
)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM