在SQL Server中使用属性计数选择动态结果

在SQL Server中使用属性计数选择动态结果,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在使用SQL Server,尝试获取给定场景的数据,但未成功。任何形式的帮助都将不胜感激 情况是: 如果cont为1,只需返回用户id即可。 如果cont大于1,则返回启用了='01'的用户。 如果cont大于1且该用户启用了大于1='01',则根据字母顺序返回表中的第一个用户。 结构和样本数据 CREATE TABLE TableA ( id int auto_increment primary key, lan varchar(20), user varchar(30)

我正在使用SQL Server,尝试获取给定场景的数据,但未成功。任何形式的帮助都将不胜感激

情况是:

  • 如果cont为1,只需返回用户id即可。
  • 如果cont大于1,则返回启用了='01'的用户。
  • 如果cont大于1且该用户启用了大于1='01',则根据字母顺序返回表中的第一个用户。
  • 结构和样本数据

    CREATE TABLE TableA 
    (
      id int auto_increment primary key, 
      lan varchar(20), 
      user varchar(30)
    );
    
    INSERT INTO TableA (lan, user) VALUES ('a','1');
    INSERT INTO TableA (lan, user) VALUES ('b','2');
    INSERT INTO TableA (lan, user) VALUES ('c','3');
    INSERT INTO TableA (lan, user) VALUES ('d','4');
    INSERT INTO TableA (lan, user) VALUES ('e','5');
    INSERT INTO TableA (lan, user) VALUES ('f','6');
    
    CREATE TABLE TableB (
      id int auto_increment primary key, 
      fuser VARCHAR(10),
      enabled VARCHAR(4)
    );
    
    INSERT INTO TableB (fuser) VALUES ('1');
    INSERT INTO TableB (fuser, enabled) VALUES ('2','01');
    INSERT INTO TableB (fuser, enabled) VALUES ('3','01');
    INSERT INTO TableB (fuser) VALUES ('3');
    INSERT INTO TableB (fuser, enabled) VALUES ('4','01');
    INSERT INTO TableB (fuser, enabled) VALUES ('5','01');
    INSERT INTO TableB (fuser, enabled) VALUES ('5','01');
    INSERT INTO TableB (fuser, enabled) VALUES ('5','01');
    INSERT INTO TableB (fuser) VALUES ('5');
    
    我的查询

    SELECT LAN, USER AS USER, COUNT(fuser) AS cont, FUSER as FUSER,
    CASE  
      WHEN COUNT(fuser)=4  THEN FUSER
      WHEN COUNT(fuser)=2 THEN FUSER
      WHEN COUNT(fuser)=1  THEN FUSER
      ELSE null
    END as result
                from TableA
                LEFT JOIN TableB
                ON trim(lower(USER))=trim(lower(FUSER))
          GROUP BY USER
    

    下面是一个SQL提示:

    您需要为fuser计算哪些分组列?在你的小提琴中,你正在计算定影器,并按定影器分组,这没有任何意义。如果您正在计算fuser,则需要按其他内容进行分组。我已根据您的评论更新了fiddle。@anand请同时更新您的输出鉴于您的fiddle中的样本数据,你能发布你想要的结果吗?你的fiddle使用自动增量,这是mysql语法,你的标签是sql server,如果你提供了fiddle,你不需要查询,但是你提供了它很好,如果可能的话,只需显示你想要的和实际的输出
    declare @temp table ( nofouser int, id int )
    
    insert into @temp 
    select distinct count(t1.[user]) over (partition by t1.[user]) as noofuser,t1.id 
    from TableA t1 
      LEFT JOIN TableB t2 on t1.[user]=t2.fuser
    
    select [user] 
    from @temp r 
       inner join TableA on TableA.id=r.id 
    where nofouser=1
    
    select distinct [user] 
    from @temp r 
       inner join TableA on TableA.id=r.id 
       inner join TableB on TableB.fuser=TableA.[user] 
    where nofouser>1 
      and TableB.[enabled]=1
    
    select * 
    from ( 
      select count([user]) over (partition by [user]) as enableduser,
             [user] 
     from @temp r 
         inner join TableA on TableA.id=r.id 
         inner join TableB on TableB.fuser=TableA.[user] 
         where nofouser>1 and TableB.[enabled]=1 
     ) s 
     where enableduser>1