SQL - 过滤哪些列的值与另一列值

时间:2016-10-13 14:47:02

标签: sql sql-server

如何编写查询来过滤哪个列A与另一列B的组合多于1的记录?我将通过以下示例更好地解释这个问题:

有2个表:

名册

staffno | location |   date 
----------------------------
sf001   |    A     | 1/10/2016
sf001   |    A     | 2/10/2016
sf001   |    A     | 3/10/2016
sf002   |    A     | 1/10/2016
sf002   |    B     | 2/10/2016
sf002   |    A     | 3/10/2016
sf003   |    A     | 1/10/2016
sf003   |    A     | 2/10/2016
sf003   |    A     | 3/10/2016

staffprofile

staffno
-------
sf001
sf002
sf003
sf004

我写了一份声明,找到了共存的员工编号,并排除了有超过1个栏目组合的员工" staffno"和"位置"。例如,在表格"名册",staffno" sf002"有多个地点" A"和" B",所以staffno" sf002"应该排除在结果中;而staffno" sf001"只有一个单一的位置" A",所以这包括在内。

我写了以下声明:

select staffno
from roster a, staffprofile b
where a.staffno = b.staffno
and not exists (
     --some stmt here
)

结果应该有2条记录:sf001和sf003。

最初我想使用" NOT EXISTS"过滤那些具有多个字段staffno和location组合的记录,但我不知道查询那些不需要的记录。我也尝试使用" Case When&#34 ;,但我没有写一个声明来检查那些重复的" staffno"有不同的"位置"。

更高级的查询除了在同一个月内拥有记录外,还会查找上述条件的记录。

5 个答案:

答案 0 :(得分:3)

这是使用HAVING子句

的一种方法
SELECT staffno
FROM   staffprofile b
WHERE  NOT EXISTS (SELECT 1
                   FROM   roster a
                   WHERE  a.staffno = b.staffno
                   HAVING Count(DISTINCT location) > 0) 

sub-query内,我们正在检查每个location的{​​{1}}计数如果大于staffno那么它将被排除在0

注意:如果您不希望同一个NOT EXISTS重复location,请从staffno聚合<DISTINCT移除COUNT / p>

答案 1 :(得分:1)

只需使用group byhaving

select staffno
from roster
group by staffno
having min(location) = max(location);

答案 2 :(得分:1)

您可以计算工作人员喜欢的位置数

SELECT staffno,
       COUNT(distinct location)
FROM tablename
GROUP BY staffno

然后选择“1”

SELECT staffno FROM (
  SELECT staffno,
         COUNT(distinct location) as C
  FROM tablename
  GROUP BY staffno
) AS sub
WHERE sub.C = 1

或使用HAVING

SELECT staffno
FROM tablename
GROUP BY staffno
HAVING COUNT(distinct location) = 1 

答案 3 :(得分:0)

$count = (int) $dogs;
$dogs_array = [];
for($i = 0;$count>$i; $i++){
    $dogs_array[$i] = "Dogs ".$i;
}
print_r($dogs_array);

答案 4 :(得分:0)

稍微解释一下这个查询的子查询vu找到在同一年/月内工作过多个地点(超过1个)的员工

然后根据StaffNo,年和月将名册表连接到vu,以确保它仅限于您提到的同一个月。

然后NOT EXISTS取代使用WHERE vu.StaffNo IS NULL而不是使用 SELECT roster.StaffNo, Year(roster.Date), Month(roster.Date) FROM roster LEFT JOIN ( SELECT Year(date) year, Month(Date) month, StaffNo, COUNT(DISTINCT Location) Locations FROM roster GROUP BY Year(date), Month(Date), StaffNo HAVING COUNT(DISTINCT Location)>1 ) vu ON roster.StaffNo = vu.StaffNo AND Year(roster.Date) = vu.year AND Month(roster.Date) = vu.month WHERE vu.StaffNo IS NULL GROUP BY roster.StaffNo, Year(roster.Date), Month(roster.Date) 限制结果,而当月只有1个或更少位置工作的人员。

NOT EXISTS

如果您想使用SELECT StaffNo, Year(Date), Month(Date) FROM roster SingleLocationRoster WHERE NOT EXISTS ( SELECT Year(date) year, Month(Date) month, StaffNo, COUNT(DISTINCT Location) Locations FROM roster WHERE SingleLocationRoster.StaffNo = roster.StaffNo AND Year(SingleLocationRoster.Date) = Year(roster.Date) AND Month(SingleLocationRoster.Date) = Month(roster.Date) GROUP BY Year(date), Month(Date), StaffNo HAVING COUNT(DISTINCT Location)>1 ) GROUP BY StaffNo, Year(Date), Month(Date) 语法,可以使用以下查询

request.ServicePoint.Expect100Continue = true;