Displaying data in a different manner

bapster :

So I have a table that binds ProductId and GroupId. The product can be assigned to all of 5 groups (1-5). If the product doesn't exist in the table, it's not assigned to any of the group

ProductId | GroupId
-------------------
100       |    1
100       |    2
200       |    1
200       |    2
200       |    3
200       |    4
200       |    5

Taking a look at this table, we know that Product that goes by id 100 is assigned to 2 groups (1,2) and the product of id 200 is assigned to 5 groups (1-5).

I'm trying to write a query that will display each product in separate row, together with columns for all of the 5 groups and a bit value that contains information if the product belongs to the group or not (0,1). A visualization of the result I need:

ProductId | IsGroup1 | IsGroup2 | IsGroup3 | IsGroup4 | IsGroup5
-----------------------------------------------------------------
100       |    1     |      1   |      0   |     0    |     0      -- this belongs to groups 1, 2
200       |    1     |      1   |      1   |     1    |     1      -- this belongs to all of the groups

I know I could probably solve it using a self join 5 times on each distinct product, but I'm wondering if there's a more elegant way of solving it?

Any tips will be strongly appreciated

scsimon :

You could use a pivot. Since you only have 5 groups you don't need a dynamic pivot.

DB FIDDLE

select
   ProductId
   ,IsGroup1 = iif([1] is null,0,1)
   ,IsGroup2 = iif([2] is null,0,1)
   ,IsGroup3 = iif([3] is null,0,1)
   ,IsGroup4 = iif([4] is null,0,1)
   ,IsGroup5 = iif([5] is null,0,1)
from
(select ProductID, GroupId from mytable) x
pivot
(max(GroupId) for GroupId in ([1],[2],[3],[4],[5])) p

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=383150&siteId=1