如何编写查询来过滤哪个列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"有不同的"位置"。
更高级的查询除了在同一个月内拥有记录外,还会查找上述条件的记录。
答案 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 by
和having
:
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;