简体   繁体   中英

This is not permitted when the subquery follows Subquery returned more than 1 value

I am having problem returning values to the column checklist percentage. It is giving error "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=," The tables provided are just sample from thousands of rows which have many evaluation.

The tables are 2 and I extracted this sample from thousands of rows :

╔═════════╦═══════════════╗    
║ 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          ║
╠═════════╬═══════════════╣

second table is :

╔═════════╦════════════╗
║ 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          ║
╠═════════╬════════════╣
╚═════════╩════════════╝

The purpose is to calculate the percentage of evaluation selected / total evaluation. The evaluation 50001 is yes and 0 and 1 means not evaluated or not selected respectatively.

 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))

I think you are looking for a update script as below-

Note: Please try with test data first.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM