2012-01-25 7 views
0

を持つ新しい列を取得しようとしている:彼らは 列(フォルダID、フォルダ名、ユーザーID)の列(フォルダID、shortlisteduserid)と 私は2つのテーブル持ってYES、NO値

  • 選考ユーザーと

    1. 選考フォルダを私は、ユーザーID 50で作成したフォルダのリストを取得し、50はどのように多くのユーザーの各フォルダ内の

      を選考したことをカウントするために、次のクエリを使用していますフォルダID

    にリンクされています10

    select a.folderid,a.foldername,count(b.ShortlistedUserId) as [count] 
    from tblshortlistfolders a left outer join tblshortlistedusers b on a.folderid=b.folderid 
    where a.userid = 50 
    group by a.folderid,a.foldername 
    

    は、今私は、その値は、各行のためのフォルダIDは、その後tblshortlistedusersユーザーIDで 値を49が含まれている場合は「はい」=

  • 場合を

    1. に従うようになり、この結果、1つ以上の列を追加したいですフォルダIDは、値=「NO」

    しかし、私は何とかこの条件を適用すると、列数が正しい値を示していないと、結果はgrouを得ることはありませんtblshortlistedusersユーザーID 49が含まれていませんフォルダごとにペダルを押します。同じフォルダの結果に複数の行が表示されます。必要なテーブルの結果を得るためにどのように

    あなたがしようとしたクエリを示した場合(フォルダID、フォルダ名、トータルカウント、「newcolumn」)

  • 答えて

    1

    が役立つだろう。私は、これはあなたがやりたいかもしれないと思う。(メモリから)

    select a.folderid,a.foldername,count(b.ShortlistedUserId) as [count] 
    ,case when count(case when b.ShortlistedUserId=49 then 1 else null end)>0 then 'Yes' else 'No' end as [NewColumn] 
    from tblshortlistfolders a left outer join tblshortlistedusers b on a.folderid=b.folderid 
    where a.userid = 50 
    group by a.folderid,a.foldername 
    

    EDIT: たぶん私はあなたのデータを誤解しています。ここではいくつかのサンプルデータとの完全な例です。

    use tinker -- or whatever test db you have. 
    
    CREATE TABLE tblshortlistfolders (
    folderid  INT NOT NULL primary key 
    ,foldername NVARCHAR(255) 
    ,userid  INT NOT NULL 
    ); 
    
    CREATE TABLE tblshortlistedusers (
    folderid   INT NOT NULL 
    ,shortlisteduserid INT NOT null 
    ,constraint fk_tblshortlistedusers_folderid foreign key (folderid) references [dbo].[tblshortlistfolders] 
    ); 
    
    INSERT INTO tblshortlistfolders VALUES (100 , 'one' , 1); -- created by user 1 
    INSERT INTO tblshortlistfolders VALUES (200 , 'two' , 50); -- created by user 50 
    INSERT INTO tblshortlistfolders VALUES (300 , 'three' , 50); -- created by user 50 
    INSERT INTO tblshortlistfolders VALUES (400 , 'four' , 49); -- created by user 49 
    
    INSERT INTO tblshortlistedusers VALUES (100, 1); -- shortlisted by 50 
    INSERT INTO tblshortlistedusers VALUES (100, 50); -- shortlisted by 01 too 
    INSERT INTO tblshortlistedusers VALUES (200, 50); -- shortlisted by 50 
    INSERT INTO tblshortlistedusers VALUES (200, 49); -- shortlisted by 49 too 
    INSERT INTO tblshortlistedusers VALUES (300, 50); -- shortlisted by 50 
    INSERT INTO tblshortlistedusers VALUES (300, 50); -- shortlisted by 1 too 
    
    SELECT a.folderid,a.foldername,COUNT(b.ShortlistedUserId) AS [COUNT] 
    ,CASE WHEN COUNT(CASE WHEN b.ShortlistedUserId=49 THEN 1 ELSE NULL END)>0 THEN 'Yes' ELSE 'No' END AS [NewColumn] 
    FROM tblshortlistfolders a LEFT OUTER JOIN tblshortlistedusers b ON a.folderid=b.folderid 
    WHERE a.userid = 50 
    GROUP BY a.folderid,a.foldername 
    

    これは私があなたの質問を形成わかるものを行います。多分あなたはあなたが望むものの例を挙げることができますか?

    +0

    でも、私はこのようにしていますが、問題はそのフォルダ内のユーザーの数が常に0であることです。ユーザー49は含まれていません。合計ユーザーがそれに含まれている... :( – nav

    +0

    私が与えたサンプルを確認し、私たちは、これはあなたが期待しているものとどのように異なるかを教えてください? –

    0
    select 
        a.folderid, 
        a.foldername, 
        count(b.ShortlistedUserId) as [count], 
        case when b.userid = 49 then 'yes' else 'no' end as [newcolumn] 
    from 
        tblshortlistfolders a 
        left outer join tblshortlistedusers b on a.folderid=b.folderid 
    where a.userid = 50 
    group by a.folderid,a.foldername 
    
    +0

    表BのDONOTは、ユーザーID列を持っていると私はShortlistedUserIdと交換するとき、また、GROUPBY句にそれはシングルユーザーのための単一の行を与える単一のフォルダの複数の行:( – nav