2012-05-04 4 views
1

文字列にSQLクエリを取得するプロシージャがあります。例:確率条件が満たされている行のみ集計

SELECT SUM(Refuse) FROM FOOD_DES WHERE Refuse > 1 

ただし、条件を満たす行のみを合計する必要があります。

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

が、このdoesntの仕事(それはすべての要素を合計): 条件は次のようになります

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 

しかし、どちらもうまくいきません。 任意のアイデア:)

+0

は、あなたがしようとしているものを知らせるために 'having'句 – asawyer

+0

+1を検索します。 – Matthew

答えて

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 
+0

データ内の各行に対して同じRandomNumberを返します。( – Mardok

+0

)RAND()がそれを行うためです。[MSDNによる](http://msdn.microsoft.com/en-us/library/ms177610.aspx) "RAND(CHECKSUM(NEWID()))"のように、RAND()関数に渡されたシードをランダム化する必要があります。 –

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 
関連する問題