问题
i have the following problem in MSACCESS 2003
i have a query called A_Gravur which 3 columns SP1, SP2, SP3
now i want to search for duplicates.
query A_Gravur:
SP1 | SP2 | SP3
64 | CB75000 | 3
64 | empty | D
70 | CB70010 | 1
70 | CB70010 | 1
119 | CB70050 | 5
119 | empty | D
165 | S15002 | Schalter
165 | S15002 | Schalter
194 | R70034 | Poti
194 | R10023 | Potentiometer
196 | S10063 | Schalter
196 | S10063 | Schalter
197 | S10063 | Schalter
198 | S10070 | 3
199 | CB75000 | 5
first: filter duplicates in SP1 from A_Gravur
result:
SP1 | SP2 | SP3
64 | CB75000 | 3
64 | empty | D
70 | CB70010 | 1
70 | CB70010 | 1
119 | CB70050 | 5
119 | empty | D
165 | S15002 | Schalter
165 | S15002 | Schalter
194 | R70034 | Poti
194 | R10023 | Potentiometer
196 | S10063 | Schalter
196 | S10063 | Schalter
in the first duplicate search are too many results! it should be filtered like this: Filter (IF one result in SP3 is letter D then dont show it) Filter (IF [SP1 and SP2] = [SP1 and SP2 from next record] then dont show it
Second: filter duplicates in SP2 from A_Gravur
SP1 | SP2 | SP3
64 | CB75000 | 3
199 | CB75000 | 5
196 | S10063 | Schalter
196 | S10063 | Schalter
197 | S10063 | Schalter
my final result should look like this it is the result from SP1 duplicate search with filter + SP2 duplicate search
SP1 | SP2 | SP3
194 | R70034 | Poti 470k
194 | R10023 | Potentiometer
196 | S10063 | Schalter
197 | S10063 | Schalter
64 | CB75000 | 3
199 | CB75000 | 5
any idea how to solve my problem? a function or a sql query?
回答1:
I think this SQL query will give you what you want :
SELECT SP1, SP2, SP3
FROM A_Gravur
WHERE (SP1 IN
(SELECT SP1
FROM A_Gravur
WHERE SP3<>'D'
GROUP BY SP1
HAVING COUNT(*)>1)
OR SP2 IN
(SELECT SP2
FROM A_Gravur
WHERE SP3<>'D'
GROUP BY SP2
HAVING COUNT(*)>1))
AND SP3<>'D'
ORDER BY SP1, SP2;
` You can play with this at http://sqlfiddle.com/#!2/7351d/16
To eliminate the lines entirely duplicated, it becomes more complicated :
SELECT SP1, SP2, SP3
FROM A_Gravur
WHERE (SP1 IN
(SELECT SP1
FROM A_Gravur
WHERE SP3<>'D'
GROUP BY SP1
HAVING COUNT(*)>1)
OR SP2 IN
(SELECT SP2
FROM A_Gravur
WHERE SP3<>'D'
GROUP BY SP2
HAVING COUNT(*)>1))
AND CONCAT(CAST(SP1 AS CHAR),SP2,SP3) NOT IN
(SELECT CONCAT(CAST(SP1 AS CHAR),SP2,SP3)
FROM A_Gravur
WHERE SP3 <> 'D'
GROUP BY CONCAT(CAST(SP1 AS CHAR),SP2,SP3)
HAVING COUNT(*)>1)
AND SP3<>'D'
ORDER BY SP1, SP2;
This can be found at http://sqlfiddle.com/#!2/7351d/35
Note that CONCAT(CAST(SP1 AS CHAR),SP2,SP3)
is MySQL syntax for SQL Fiddle.
In MS Access, one would use Format(SP1) & SP2 & SP3
来源:https://stackoverflow.com/questions/15320798/searching-for-filtered-duplicates-in-access-query