2009-08-11 31 views
2

せずに画像をn個の%を選択、(100-N)%私たちは写真を持ってユーザーを格納DBを持っています。 を選択し、n個のユーザー:SQL:写真

私は、次のような結果を得るためにSQLでエレガントな方法を探しています。例えば、これらのn人のユーザ。 60%に関連する画像があり、40%に画像がありません。画像を持っているユーザーが60%未満の場合、その結果は画像なしのユーザーで埋められるべきです。

DBに複数のSELECTを発射せずにSQLでのいくつかのエレガントな方法はありますか?

ありがとうございました。

答えて

0

醜いコード:

SELECT TOP @n * FROM 
(


     //-- We start selecting users who have a picture (ordered by HasPicture) 
     //-- If there is no more users with a picture, this query will fill the 
     //-- remaining rows with users without a picture 
     SELECT TOP 60 PERCENT * FROM tbUser 
     ORDER BY HasPicture DESC 

     UNION 

     //-- This is to make sure that we select at least 40% users without a picture 
     //-- AT LEAST because in the first query it is possible that users without a 
     //-- picture have been selected 
     SELECT TOP 40 PERCENT * FROM tblUser 
     WHERE HasPicture = 0 

     //-- We need to avoid duplicates because in the first select query we haven't 
     //-- specified HasPicture = 1 (and we didn't want to). 
     AND UserID not IN 
     (
     SELECT TOP 60 PERCENT UserID FROM tbUser 
     ORDER BY HavePicture DESC 
    ) 
) 
+0

-1えっ?あなたはN全体に限定されず、誰が絵を持っているのか、誰が誰でないのかを伝えるコードは意味がありません。 –

+0

私はいくつかのコメントを追加しましたので、今はもっと意味があると思います...それは最もエレガントなコードではないと私は同意しますが、うまくいくと思います。私は個人的にロブのソリューションを好む。 – Max

+0

ありがとうございました。あなたが好きなら、それを答えとしてマークすることができます。私はまだ自分のプロフィールに多くの回答を受け入れていないような気がします。私の評判の大部分は、最初にサイトに参加したときに投稿した1つの回答から来ています。 –

0
SELECT TOP(n) HasPicture --should be 0 or 1 to allow ORDER 
    FROM Users 
    ORDER BY 1 
2

だからあなたはあなたが希望するユーザーの数である、@nを提供しています。 @ xは、写真が必要なユーザーの割合です。

select top (@n) * 
from 
(
select top (@n * @x/100) * 
from users 
where picture is not null 

union all 

select top (@n) * 
from users 
where picture is null 
) u 
order by case when picture is not null then 1 else 2 end; 

そう...あなたは写真を持って、そして残りは写真を持っていない人でなければならない最も@n * @x/100ユーザーで欲しいです。だから私は自分の@n * @ x/100の絵 - 人と私の@nを完成させるのに十分な他の人との間で '合体'をしています。それから私はそれらを選んで、TOPを注文して写真を持っている人たちを守るようにします。

ロブ

は編集:実は、これは良いだろう:

select top (@n) * 
from 
(
select top (@n * @x/100) *, 0 as NoPicture 
from users 
where picture is not null 

union all 

select top (@n) *, 1 as NoPicture 
from users 
where picture is null 
) u 
order by NoPicture; 

...それはORDER BYの影響を除去するので。

+0

(ジュネーブ)-Maxしかし...あなたは絵なし十分な人々を持っていない場合、あなたは絵-人々と(100-X)%に記入する必要がありますか? –

+0

hm no。写真がない人がはるかに多いため、これは必須条件ではありません。 – Max

+0

元気です。さて、すべてのオプションを読んで、それぞれのシナリオが何をしているのかを理解して、あなたの要件に最もよく合ったものを選んでください(特に明確ではありません)。 –

0

は、要件のこのタイプの選択ケースを使用してください。