当子查询跟随子查询返回大于1的值时,这是不允许的

时间:2019-05-27 14:44:39

标签: sql sql-server

我在将值返回到列清单百分比时遇到问题。它给出错误“子查询返回的值大于1。当子查询后跟=,!=”时,这是不允许的。”提供的表仅是来自数千行具有多个评估值的示例。

表是2,我从数千行中提取了此示例:

╔═════════╦═══════════════╗    
║ id      ║ value_integer ║
╠═════════╬═══════════════╣   
║ 2059064 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064435 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064889 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064893 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2086272 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2134036 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2163046 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2175279 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2175279 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2186928 ║ NULL          ║
╠═════════╬═══════════════╣

第二张表是:

╔═════════╦════════════╗
║ id      ║ evaluation ║
╠═════════╬════════════╣
║ 2059064 ║ 0          ║
╠═════════╬════════════╣
║ 2064435 ║ 0          ║
╠═════════╬════════════╣
║ 2064889 ║ 0          ║
╠═════════╬════════════╣
║ 2064893 ║ 0          ║
╠═════════╬════════════╣
║ 2086272 ║ 50001      ║
╠═════════╬════════════╣
║ 2128447 ║ 0          ║
╠═════════╬════════════╣
║ 2128447 ║ 0          ║
╠═════════╬════════════╣
║ 2128447 ║ 50001      ║
╠═════════╬════════════╣
║ 2134036 ║ 50001      ║
╠═════════╬════════════╣
║ 2163046 ║ 50001      ║
╠═════════╬════════════╣
║ 2175279 ║ 50006      ║
╠═════════╬════════════╣
║ 2175279 ║ 50001      ║
╠═════════╬════════════╣
║ 2186928 ║ 50004      ║
╠═════════╬════════════╣
║ 2190848 ║ 50001      ║
╠═════════╬════════════╣
║ 2190848 ║ 0          ║
╠═════════╬════════════╣
║ 2190848 ║ 0          ║
╠═════════╬════════════╣
║ 2190848 ║ 1          ║
╠═════════╬════════════╣
║ 2190848 ║ 1          ║
╠═════════╬════════════╣
║ 2222107 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 50005      ║
╠═════════╬════════════╣
║ 2250093 ║ 0          ║
╠═════════╬════════════╣
╚═════════╩════════════╝

目的是计算所选评估/总评估的百分比。评估50001为是,0和1表示未评估或未相应选择。

 UPDATE DB.D_ENERGY_REFERENCE
    SET D_ENERGY_REFERENCE.VALUE_INTEGER = (SELECT  (SELECT CAST(COUNT(EVALUATION) AS FLOAT)
                                                     FROM DB.D_CHECK_LIST D_CHECK_LIST
                                                     WHERE D_CHECK_LIST.EVALUATION  = 50001
                                                     GROUP BY ID) / (SELECT CAST(COUNT(EVALUATION) AS FLOAT)
                                                                     FROM DB.D_CHECK_LIST D_CHECK_LIST
                                                                     WHERE D_CHECK_LIST.EVALUATION  NOT IN (0,1)
                                                                     GROUP BY ID) * 100
                                            FROM DB.D_CHECK_LIST D_CHECK_LIST 
                                            WHERE D_CHECK_LIST.ID IN (SELECT ID
                                                                      FROM DB.D_ENERGY_REFERENCE  
                                                                      WHERE ID = D_CHECK_LIST.ID))

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找如下更新脚本-

注意:请先尝试使用测试数据。

UPDATE T
SET T.VALUE_INTEGER = A.Val
FROM D_ENERGY_REFERENCE T
INNER JOIN 
(
    SELECT 
    ID,
    CASE 
        WHEN CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT) = 0 THEN 0
        ELSE
        (
            CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  = 50001 THEN EVALUATION ELSE NULL END) AS FLOAT)
            /
            CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT)
        ) * 100 
    END AS Val
    FROM D_CHECK_LIST
    GROUP BY ID
)A ON T.ID = A.ID