I'm using the following query:
SELECT TOP 12
INVENTABLE.ITEMNUMBER,
INVENTABLE.ITEMNAME1,
INVENTABLE.ITEMNAME2,
INVENTABLE.W_TILBUD,
INVENTABLE.COSTPRICE,
INVENTABLE.VENDITEMNUMBER,
INVENTABLE.A_PRODUCENT,
INVENTABLE.GROUP_,
INVENTABLE.A_GROSSISTLAGER,
INVENTABLE.SupplementaryUnits
FROM INVENTRANS
INNER JOIN INVENTABLE ON INVENTABLE.ITEMNUMBER=INVENTRANS.ITEMNUMBER
WHERE INVENTRANS.ACCOUNT='xxx' AND
INVENTABLE.W_VISFORSIDE = 0 AND
INVENTABLE.W_VISWWW = 1 AND
INVENTABLE.BLOCKED = 0
ORDER BY INVENTRANS.ROWNUMBER DESC
This query selects the 12 last sold items from one table (INVENTRANS), and gets the item information from another (INVENTABLE). It works like it should, except I would like to prevent multiple of the same item (INVENTRANS.ITEMNUMBER) to be in the same result.
I have tried looking around for solutions and tried several examples with a DISTINCT or GROUP BY, but I haven't been able to make it work :/
Any help much appreciated! :)
Solution:
;WITH CTE AS (
SELECT ROW_NUMBER() OVER (PARTITION BY INVENTRANS.ITEMNUMBER
ORDER BY INVENTRANS.ROWNUMBER DESC) AS rn,
INVENTRANS.ITEMNUMBER,
INVENTRANS.ROWNUMBER,
INVENTABLE.ITEMNAME1,
INVENTABLE.ITEMNAME2,
INVENTABLE.W_TILBUD,
INVENTABLE.COSTPRICE,
INVENTABLE.VENDITEMNUMBER,
INVENTABLE.A_PRODUCENT,
INVENTABLE.GROUP_,
INVENTABLE.A_GROSSISTLAGER,
INVENTABLE.SupplementaryUnits
FROM INVENTRANS
INNER JOIN INVENTABLE ON INVENTABLE.ITEMNUMBER=INVENTRANS.ITEMNUMBER
WHERE INVENTRANS.ACCOUNT='xxx' AND
INVENTABLE.W_VISFORSIDE = 0 AND
INVENTABLE.W_VISWWW = 1 AND
INVENTABLE.BLOCKED = 0
)
SELECT TOP 12 *
FROM CTE
WHERE rn = 1
ORDER BY ROWNUMBER DESC
You can use
ROW_NUMBER
with aPARTITION BY
clause to identify duplicates:Any record returned from
CTE
withrn > 1
is a duplicate and is thus filtered out by theWHERE
clause. Duplicate records filtered out are the ones having the lowestROWNUMBER
values. You can change theORDER BY
clause ofROW_NUMBER
to change this criterion any way you like.