I have this table
Products
Id | ProductName | ProductCode |
---|---|---|
1 | Alexa | P0001 |
2 | Alexa | P0002 |
3 | Alexa 2 | P0003 |
4 | Aquarium | P0004 |
5 | Aquarium X | P0004 |
6 | Bathtub | P0005 |
x
CREATE PROCEDURE [dbo].[usp_GetFilter]
@filter nvarchar(max),
@search nvarchar(max),
@rows int = 10
AS
BEGIN
DECLARE @return TABLE([id] INT, [value] NVARCHAR(50));
IF (@filter = 'ProductCode')
BEGIN
INSERT INTO @return([value], [id])
SELECT DISTINCT TOP (@rows) [Code] AS ProductCode, ProductId Id
FROM [dbo].[Products]
WHERE [Code] LIKE CONCAT(@search, '%')
ORDER BY [Code];
END
IF (@filter = 'ProductName')
BEGIN
INSERT INTO @return([value], [id])
SELECT DISTINCT TOP (@rows)[Name] AS ProductName, ProductId Id
FROM [dbo].[Products]
WHERE [Name] LIKE CONCAT(@search, '%')
ORDER BY [Name];
END
SELECT DISTINCT TOP (@rows) [id], [value]
FROM @return
ORDER BY [value]
END
Scenario 1:
declare @filter nvarchar(max) = 'ProductName'
declare @search nvarchar(max) = 'A'
declare @rows int = 10
exec [dbo].[usp_GetFilter] filter, @search, @rows
Expected Result: Returns distinct ProductName along with Id
Id | ProductName |
---|---|
1 | Alexa |
3 | Alexa 2 |
4 | Aquarium |
5 | Aquarium X |
Actual result:
Returns all product name starting with ‘A’ distinct not working
Scenario 2:
declare @filter nvarchar(max) = 'ProductCode'
declare @search nvarchar(max) = 'P000'
declare @rows int = 10
exec [dbo].[usp_GetFilter] filter, @search, @rows
Expected Result: Returns distinct Product Code along with Id
Id | ProductCode |
---|---|
1 | P0001 |
2 | P0002 |
3 | P0003 |
4 | P0004 |
6 | P0005 |
Actual result:
Returns all product Code starting with ‘P000’ distinct not working
Advertisement
Answer
Check The Below Code:
Use MIN
function
DECLARE
@filter nvarchar(max) = 'ProductCode',
@search nvarchar(max)='P000',
@rows int = 10
BEGIN
DECLARE @return TABLE([id] INT, [value] NVARCHAR(50));
IF (@filter = 'ProductCode')
BEGIN
INSERT INTO @return([value], [id])
SELECT TOP (@rows) [Code] AS ProductCode, MIN( Id)
FROM @Products
WHERE [Code] LIKE CONCAT(@search, '%')
GROUP BY [Code]
ORDER BY [Code];
END
IF (@filter = 'ProductName')
BEGIN
INSERT INTO @return([value], [id])
SELECT TOP (@rows)[Name] AS ProductName, MIN( Id)
FROM @Products
WHERE [Name] LIKE CONCAT(@search, '%')
GROUP BY [Name]
ORDER BY [Name];
END
SELECT TOP (@rows) [id], [value]
FROM @return
ORDER BY [id],[value]
END