在SQL Server中使用属性计数选择动态结果
我正在使用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)
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