quinekxi
quinekxi

Reputation: 889

How to combine two values (row) into a single row with custom value?

So I have this sample table. Contains data of what OS are installed of all internet shop branches.

ID   ShopName   PCName   OS
1    Mineski    M101     WinXP
2    Mineski    M102     WinXP
3    GameCity   G201     Win7
4    GameCity   G202     Win7
5    CyberBob   C301     WinXP
6    CyberBob   C302     Win7

I need to query the OS installed by Shop.

I can do this using this query.

select ShopName, OS
from ShopInv
group by ShopName, OS

Expected results would be:

ShopName    OS
CyberBob    Win7
CyberBob    WinXP
GameCity    Win7
Mineski     WinXP

However, I only want 1 row per shop to be listed. So in cases there are more than 1 row (due to different OS version installed) like the sample above. I just want to display Mixed.

So the result would be something like this:

ShopName    OS
CyberBob    Mixed
GameCity    Win7
Mineski     WinXP

Is this feasible on SQL Server 2008?

SQLFiddle

Note: I'm a bit confused on how should I state my question so please do edit it if you like. :)

Upvotes: 5

Views: 87

Answers (4)

mohan111
mohan111

Reputation: 8865

As Mentioned in question i have given both the outputs for the expected

 declare @t table (Id int,Shop varchar(10),PCname varchar(10),OS Varchar(10))

    insert into @t (Id,Shop,PCname,os)values (1,'Mineski','M101','WinXP'),
    (2,'Mineski','M102','WinXP'),(3,'GameCity','G201','Win7'),
    (4,'GameCity','G202','Win7'),(5,'CyberBob','C301','WinXP'),
    (6,'CyberBob','C302','Win7')

First result

;with cte as (
select shop,OS,ROW_NUMBER()OVER(PARTITION BY shop,OS ORDER BY shop ) rn from @t)
select shop,OS from cte
where rn = 1

And final result set

;with cte as (
select shop,OS,ROW_NUMBER()OVER(PARTITION BY shop,OS ORDER BY shop ) rn from @t)
,CTE2 AS (
Select shop,CASE WHEN R = 1 THEN 'MIXED' ELSE OS END AS 'OS' from (
select shop,OS,count(rn)R from cte
group by Shop,OS )S )
select DISTINCT shop,OS from CTE2

Upvotes: 2

potashin
potashin

Reputation: 44581

You can use case with distinct OS value count for each ShopName check :

select ShopName
     , case when count(distinct OS) > 1 then 'Mixed' else min(OS) end
from ShopInv
group by ShopName

SQLFiddle

Upvotes: 6

Thorsten Kettner
Thorsten Kettner

Reputation: 94884

This is easy: As you want to have one row per shop, group by shop only. Then get the OS with an aggregate function. This can be MIN or MAX. If you detect however, that MIN <> MAX, then you must show 'Mixed' instead.

select 
  ShopName,
  case when MIN(OS) = MAX(OS) then MIN(OS) else 'Mixed' end as OS
from ShopInv
group by ShopName;

Upvotes: 4

koushik veldanda
koushik veldanda

Reputation: 1107

select Shopname,
(select case when count(shopname)>1 then 'Mixed' 
         else OS 
         from ShopInv b
         where a.shopname=b.shopname
         group by b.shopname)
from ShopInv a

Upvotes: 0

Related Questions