1

文字列でSQLクエリを取得するプロシージャがあります。例:

SELECT SUM(Refuse) FROM FOOD_DES WHERE Refuse > 1

しかし、条件が満たされた行だけを合計する必要があります。条件は次のようになります。

CONVERT(INT,RAND() * 100 ) <= @probability

しかし、これは機能しません(すべての要素を合計します):

SELECT SUM(Refuse) FROM FOOD_DES WHERE Refuse > 1 AND
CONVERT(INT,RAND() * 100 ) <= @probability

次に試してみました:

SELECT SUM(Refuse) FROM FOOD_DES  AS T CROSS APPLY fn_probability() AS F

CREATE FUNCTION fn_probability ( )
RETURNS @probabilityInfo TABLE ( Result INT )
AS 
    BEGIN 
        DECLARE @rand INT
        SET @rand = ( SELECT TOP 1
                                RandValue
                      FROM      RandView
                    )
        IF @rand <= 80 
            INSERT  INTO @probabilityInfo
                    ( Result )
            VALUES  ( 1 )
        RETURN  
    END
CREATE VIEW RandView
AS 
SELECT CONVERT(INT, RAND() * 100) AS RandValue

しかし、どちらも機能しません。何か案が?:)

4

2 に答える 2

1

このようにいかがですか:

WITH data(Refuse, RandomNumber) AS
(
    SELECT 
        Refuse
        ,CONVERT(INT, RAND(CHECKSUM(NEWID())) * 100) 
    FROM 
        FOOD_DES
    WHERE 
        Refuse > 1
)
SELECT
    SUM(Refuse) 
FROM
    data
WHERE
    RandomNumber <= @probability
于 2012-05-04T21:08:21.930 に答える
1

rand()ステートメント中に一度だけ実行されるため、それ自体は機能しません。

行のランダムなセットが必要な場合、通常は疑似乱数を使用します。

select sum(refuse)
from 
(
   SELECT Refuse,
      row_number()  over (partition by null order by (select '')) as rownum
   FROM FOOD_DES
   WHERE Refuse > 1
) t
where mod(rownum*101-67, 100) < @probability
于 2012-05-05T03:22:44.663 に答える