I have tables as below
╔════╦═══════╗
║ ID ║ NAME ║
╠════╬═══════╣
║ 1 ║ cat 1 ║
║ 2 ║ cat 2 ║
║ 3 ║ cat 3 ║
╚════╩═══════╝
╔════╦════════════╦═════════════╗
║ ID ║ CATEGORYID ║ PRODUCTNAME ║
╠════╬════════════╬═════════════╣
║ 1 ║ 1 ║ product1 ║
║ 2 ║ 1 ║ product2 ║
║ 3 ║ 1 ║ product3 ║
║ 4 ║ 2 ║ product1 ║
║ 5 ║ 2 ║ product2 ║
║ 6 ║ 3 ║ product1 ║
║ 7 ║ 3 ║ product3 ║
╚════╩════════════╩═════════════╝
╔════╦════════════╦═════════════╗
║ ID ║ CATEGORYID ║ PRODUCTNAME ║
╠════╬════════════╬═════════════╣
║ 1 ║ 1 ║ product1 ║
║ 4 ║ 2 ║ product1 ║
║ 6 ║ 3 ║ product1 ║
╚════╩════════════╩═════════════╝
As in each category there is a product name "product1" so I need a list of products that are available in all the category.
Can any one help me how to do it with SQL Server T-SQL query?
SELECT a.*
FROM Product a
INNER JOIN
(
SELECT ProductName
FROM Product
GROUP BY ProductName
HAVING COUNT(DISTINCT CategoryID) = (SELECT COUNT(*) FROM Category)
) b ON a.ProductName = b.ProductName
OUTPUT
╔════╦════════════╦═════════════╗
║ ID ║ CATEGORYID ║ PRODUCTNAME ║
╠════╬════════════╬═════════════╣
║ 1 ║ 1 ║ product1 ║
║ 4 ║ 2 ║ product1 ║
║ 6 ║ 3 ║ product1 ║
╚════╩════════════╩═════════════╝
Try:
with cte as
(select p.*, count(*) over (partition by PRODUCTNAME) cats
from product p)
select ID, CATEGORYID, PRODUCTNAME
from cte p
join (select count(*) totcats from category) c
on p.cats=c.totcats
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With