2012-07-10 16 views
10

continuación es mi tablaconsulta SQL selecto grupo

Tabla 1

+--------+----------+---------+ 
| amount | make  | product | 
+--------+----------+---------+ 
| 100 | Nokia | Mobiles | 
| 300 | Samesung | Mobiles | 
| 700 | Micromax | Mobiles | 
| 1000 | Karbonn | Mobiles | 
| 500 | Lava  | Mobiles | 
| 100 | Floyer | Gift | 
| 500 | Arichies | Gift | 
| 300 | Feeling | Gift | 
+--------+----------+---------+ 

Ahora quiero mostrar la cantidad más alta de dos para cada producto ...

Así que quieren construir una sola consulta SQL lo que me da resultado como a continuación ..

+--------+----------+---------+ 
| amount | make  | product | 
+--------+----------+---------+ 
| 1000 | Karbonn | Mobiles | 
| 700 | Micromax | Mobiles | 
| 500 | Arichies | Gift | 
| 300 | Feeling | Gift | 
+--------+----------+---------+ 

amablemente a mí para construir tales consulta ..

Respuesta

10

Se puede utilizar esta solución para recuperar el "grupo que tienen el máximo", basada en la amount:

SELECT a.* 
FROM Table1 a 
INNER JOIN Table1 b ON a.product = b.product AND a.amount <= b.amount 
GROUP BY a.amount, a.product 
HAVING COUNT(*) <= 2 

Simplemente cambie el 2 que sin embargo muchos de los superiores filas que desea recuperar por producto.

Si desea recuperar las dos filas más bajas por producto, simplemente puede cambiar el signo <= en INNER JOIN en >=.

Puede ver alrededor de esta solución aquí: SQL-Fiddle Demo

0
select top 2 amount, make, product from table1 
where product='Mobiles' 
order by amount desc 
union 
select top 2 amount, make, product from table1 
where product='Gift' 
order by amount desc 
+0

la respuesta no es general. ¿Qué pasa si tienes 100 productos? –

0

Puede hacerlo de dos maneras: 1) Añadir la columna índice de la fila que refleje el orden y luego seleccionar todas las filas con la fila < = 2

SELECT amount, make,product 
FROM 
(SELECT ROW_NUMBER() OVER (PARTITION BY [product] ORDER BY [amount] DESC) AS [RowID],* 
FROM [dbo].[Table1]) RESULT 
WHERE RowID <= 2 

2) Usted también puede unirse a la mesa a sí

SELECT a1.* FROM Table1 AS a1 
    LEFT JOIN Table1 AS a2 
    ON a1.product = a2.product AND a1.amount<= a2.amount 
GROUP BY a1.product 
HAVING COUNT(*) <= 2; 
+0

mysql no tiene funciones analíticas. –

1
SELECT a.* 
FROM Table1 a 
INNER JOIN Table1 b ON a.product = b.product AND a.amount <= b.amount 
GROUP BY a.amount, a.product 
HAVING COUNT(*) <= 2 
ORDER BY a.amount desc 

Por favor, consulte http://sqlfiddle.com/#!2/9ba82/1