【问题标题】:trying to get a new column with yes,no value试图获得一个新列,是,没有价值
【发布时间】:2012-01-25 11:42:28
【问题描述】:

我有两张桌子:

  1. 带有列(文件夹 ID、文件夹名称、用户 ID)的入围文件夹
  2. 入围用户列(folderid, shortlisteduserid) 它们与 folderid 链接

我正在使用以下查询来获取由用户 ID 50 创建的文件夹列表,并计算 50 已入围每个文件夹中有多少用户

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

现在我想在此结果中再添加一列,其每一行的值如下

  1. 如果 folderid 在 tblshortlistedusers userid 中包含 49,则 值 = '是'
  2. 如果 folderid 在 tblshortlistedusers 用户 ID 中不包含 49 然后值 = '否'

但是当我以某种方式应用此条件时,列数不会显示正确的值,并且结果不会按文件夹分组。同一文件夹的结果中显示多行。

如何获取所需的表结果(folderid、foldername、totalcount、'newcolumn')

【问题讨论】:

    标签: sql sql-server


    【解决方案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
    

    编辑: 也许我误解了你的数据。这是一个包含一些示例数据的完整示例:

    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
    

    这符合我对您问题的理解。也许你可以举一个你想要的例子?

    【讨论】:

    • 即使我这样做,但问题是该文件夹中的用户计数始终为零,不包含用户 49 .. 包含用户 ID 49 的文件夹显示正确其中包含的用户总数.. :(
    • 请查看我提供的示例并告诉我们这与您的预期有何不同?
    【解决方案2】:
    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
    

    【讨论】:

    • 表 b 没有 userid 列,当我用 ShortlistedUserId 替换它时,并且在 groupby 子句中它为单个用户提供单行,即单个文件夹的多行:(
    猜你喜欢
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2016-10-20
    • 2021-03-28
    • 2016-01-30
    • 2018-04-08
    • 2012-06-24
    相关资源
    最近更新 更多