2015-04-22 17 views
5

Quindi ho questa tabella di esempio. Contiene i dati di ciò che sono installati OS di tutte le filiali di internet shop.Come combinare due valori (riga) in una singola riga con valore personalizzato?

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 

Ho bisogno di interrogare il OS installato da Negozio.

Posso farlo utilizzando questa query.

select ShopName, OS 
from ShopInv 
group by ShopName, OS 

Risultati attesi sarebbero:

ShopName OS 
CyberBob Win7 
CyberBob WinXP 
GameCity Win7 
Mineski  WinXP 

Tuttavia, voglio solo 1 riga per negozio per essere elencati. Quindi nei casi ci sono più di 1 riga (a causa della diversa versione OS installata) come nell'esempio sopra. Voglio solo visualizzare Misto.

Così il risultato sarebbe qualcosa di simile:

ShopName OS 
CyberBob Mixed 
GameCity Win7 
Mineski  WinXP 

È questo fattibile su SQL Server 2008?

SQLFiddle

Nota: io sono un po 'confuso su come dovrei dichiarare la mia domanda quindi si prega di fare modificarlo, se volete. :)

+1

GROUP BY, SELECT COUNT caso ecc – jarlh

risposta

6

È possibile utilizzare case con distinctOS valore count per ogni controllo ShopName:

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

SQLFiddle

+1

non è possibile utilizzare IIF in sqlserver 2008. È stato implementato nel 2012. Può essere riscritto con CASE anche se –

+0

@ t-clausen.dk: grazie, non ha notato la versione. – potashin

+1

Lo contrassegnerò come la risposta a questa domanda poiché il mio primo pensiero è usare count(). :) – quinekxi

0
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 
+2

Ciò restituirà un errore, è necessario utilizzare una funzione di aggregazione su OS nella tua subselect –

4

Questo è facile: come si desidera avere una riga per negozio, gruppo per negozio solo. Quindi ottenere il sistema operativo con una funzione aggregata. Questo può essere MIN o MAX. Tuttavia, se rilevi MIN <, allora devi mostrare "Misto".

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

Come indicato nella domanda che mi hanno dato entrambe le uscite per l'atteso

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') 

primo risultato

;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 

E risultato finale impostato

;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 
+1

Questo non restituisce il risultato richiesto –

Problemi correlati