SQL Selecting rows with duplicate data across multiple columns

If I have a table with first names, last names (which are compound unique) and takeaways, for example

+------+-------+---------+
|First | Last  | Food    |
+------+-------+---------+
|Bob   | Smith | Pizza   |
|Bob   | Smith | Chips   |
|Jim   | Smith | Pizza   |
|Lisa  | Jones | Pizza   |
|Lisa  | Jones | Chinese |
|Lisa  | James | Mexican |
|Eric  | White | Chinese |
|Eric  | White | Chips   |
+------+-------+---------+

I want all lines to fit people who have at least two food preferences, one of which is pizza. i.e. result

+------+-------+---------+
|First | Last  | Food    |
+------+-------+---------+
|Bob   | Smith | Pizza   |
|Bob   | Smith | Chips   |
|Lisa  | Jones | Pizza   |
|Lisa  | Jones | Chinese |
+------+-------+---------+

I tried the join group ... using count (*)> 1, but that does not quite work as I want.

Any thanks, thanks.

+4
source share
5 answers

Another way: P in SQL Server 2012+.

SELECT FIRST,LAST,FOOD FROM(
SELECT A.FIRST,A.LAST,B.FOOD,
COUNT(*) OVER (PARTITION BY A.FIRST,A.LAST ORDER BY A.FIRST,A.LAST DESC) AS 'POS'
FROM TEST_FOOD A
INNER JOIN TEST_FOOD B
ON A.FIRST = B.FIRST
AND A.LAST = B.LAST
WHERE A.FOOD = 'PIZZA') TB WHERE POS = 2

And an even more standard way in SQL Server 2005+, the first one is faster, but limited to the MSSQL version.

SELECT C.FIRST,C.LAST,C.FOOD FROM 
(
SELECT A.FIRST,A.LAST FROM TEST_FOOD A
INNER JOIN TEST_FOOD B
ON A.FIRST = B.FIRST
AND A.LAST = B.LAST
WHERE B.FOOD = 'PIZZA'
GROUP BY A.FIRST,A.LAST
HAVING COUNT(*) = 2
) TB INNER JOIN 
TEST_FOOD C
ON TB.FIRST = C.FIRST
AND TB.LAST = C.LAST
+1
source

, :

SELECT first, last
FROM myTable
GROUP BY first, last
HAVING COUNT(*) > 1;

, , , :

SELECT m.*
FROM myTable m
JOIN(
   SELECT first, last
   FROM myTable
   GROUP BY first, last
   HAVING COUNT(*) > 1) tmp ON tmp.first = m.first AND tmp.last = m.last;

, , , - . , HAVING , . :

SELECT m.*
FROM myTable m
JOIN(
   SELECT first, last
   FROM myTable
   GROUP BY first, last
   HAVING COUNT(*) > 1 AND SUM(food = 'Pizza') = 1) tmp ON tmp.first = m.first AND tmp.last = m.last;

SQL Fiddle.

+1
;WITH CTE AS (
SELECT FIRST, LAST, MAX(FOOD) AS FOOD, COUNT(*) AS COUNT
FROM TABLE1
GROUP BY FIRST, LAST
HAVING COUNT(*) >= 2)
SELECT *
FROM TABLE1
WHERE FIRST+LAST IN (SELECT FIRST+LAST FROM CTE)

. .

0
select first,last,GROUP_CONCAT(food separator ',') 
from people 
group by first,last 
having count(food) > 1 AND SUM(food = 'Pizza') = 1

concat .

+------+-------+---------------+
|First | Last  | Food          |
+------+-------+---------------+
|Bob   | Smith | Pizza,Chips   |
|Lisa  | Jones | Pizza,Chinese |
+------+-------+---------------+
0

- ( McAdam331)...

 SELECT DISTINCT y.*
            FROM mytable x
            JOIN mytable y
              ON y.first = x.first
             AND y.last = x.last
            JOIN mytable z
              ON z.first = x.first
             AND z.last = x.last
             AND z.food <> y.food
           WHERE x.food = 'pizza';
0

Source: https://habr.com/ru/post/1609341/


All Articles