not - where in sql
SELECT DISTINCT en una columna (6)
Usando SQL Server, tengo ...
ID SKU PRODUCT
=======================
1 FOO-23 Orange
2 BAR-23 Orange
3 FOO-24 Apple
4 FOO-25 Orange
quiero
1 FOO-23 Orange
3 FOO-24 Apple
Esta consulta no me está llevando allí. ¿Cómo puedo SELECCIONAR DISTINTO en una sola columna?
SELECT
[ID],[SKU],[PRODUCT]
FROM [TestData]
WHERE ([PRODUCT] =
(SELECT DISTINCT [PRODUCT] FROM [TestData] WHERE ([SKU] LIKE ''FOO-%''))
ORDER BY [ID]
La solución más sencilla sería utilizar una subconsulta para encontrar el ID mínimo que coincida con su consulta. En la subconsulta usted usa GROUP BY
lugar de DISTINCT
:
SELECT * FROM [TestData] WHERE [ID] IN (
SELECT MIN([ID]) FROM [TestData]
WHERE [SKU] LIKE ''FOO-%''
GROUP BY [PRODUCT]
)
Prueba esto:
SELECT * FROM [TestData] WHERE Id IN(SELECT DISTINCT MIN(Id) FROM [TestData] GROUP BY Product)
Sé que se solicitó hace más de 6 años, pero el conocimiento sigue siendo conocimiento. Esta es una solución diferente a todas las anteriores, ya que tuve que ejecutarla bajo SQL Server 2000:
DECLARE @TestData TABLE([ID] int, [SKU] char(6), [Product] varchar(15))
INSERT INTO @TestData values (1 ,''FOO-23'', ''Orange'')
INSERT INTO @TestData values (2 ,''BAR-23'', ''Orange'')
INSERT INTO @TestData values (3 ,''FOO-24'', ''Apple'')
INSERT INTO @TestData values (4 ,''FOO-25'', ''Orange'')
SELECT DISTINCT [ID] = ( SELECT TOP 1 [ID] FROM @TestData Y WHERE Y.[Product] = X.[Product])
,[SKU]= ( SELECT TOP 1 [SKU] FROM @TestData Y WHERE Y.[Product] = X.[Product])
,[PRODUCT]
FROM @TestData X
Suponiendo que está en SQL Server 2005 o superior, puede usar un CTE con ROW_NUMBER ():
SELECT *
FROM (SELECT ID, SKU, Product,
ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY ID) AS RowNumber
FROM MyTable
WHERE SKU LIKE ''FOO%'') AS a
WHERE a.RowNumber = 1
prueba esto:
SELECT
t.*
FROM TestData t
INNER JOIN (SELECT
MIN(ID) as MinID
FROM TestData
WHERE SKU LIKE ''FOO-%''
) dt ON t.ID=dt.MinID
EDITAR
una vez que el OP corrigió su salida de samle (anteriormente solo tenía UNA fila de resultados, ahora se muestra todo), esta es la consulta correcta:
declare @TestData table (ID int, sku char(6), product varchar(15))
insert into @TestData values (1 , ''FOO-23'' ,''Orange'')
insert into @TestData values (2 , ''BAR-23'' ,''Orange'')
insert into @TestData values (3 , ''FOO-24'' ,''Apple'')
insert into @TestData values (4 , ''FOO-25'' ,''Orange'')
--basically the same as @Aaron Alton''s answer:
SELECT
dt.ID, dt.SKU, dt.Product
FROM (SELECT
ID, SKU, Product, ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY ID) AS RowID
FROM @TestData
WHERE SKU LIKE ''FOO-%''
) AS dt
WHERE dt.RowID=1
ORDER BY dt.ID
SELECT min (id) AS ''ID'', min(sku) AS ''SKU'', Product
FROM TestData
WHERE sku LIKE ''FOO%'' -- If you want only the sku that matchs with FOO%
GROUP BY product
ORDER BY ''ID''