2015-04-22 6 views
5

Also ich habe diese Beispieltabelle. Enthält Daten, welche OS von allen Internet-Shop-Filialen installiert sind.Wie zwei Werte (Zeile) in einer einzelnen Zeile mit benutzerdefinierten Wert kombinieren?

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 

Ich brauche die OS durch Geschäft installiert abzufragen.

Ich kann dies mit dieser Abfrage tun.

select ShopName, OS 
from ShopInv 
group by ShopName, OS 

Erwartete Ergebnisse wäre:

ShopName OS 
CyberBob Win7 
CyberBob WinXP 
GameCity Win7 
Mineski  WinXP 

Allerdings möchte ich nur 1 Zeile pro Shop aufgeführt werden. Also in Fällen gibt es mehr als 1 Zeile (wegen der unterschiedlichen Version OS installiert) wie das obige Beispiel. Ich möchte nur Mixed anzeigen.

So wäre das Ergebnis so etwas wie diese:

ShopName OS 
CyberBob Mixed 
GameCity Win7 
Mineski  WinXP 

Ist das auf SQL Server 2008 möglich?

SQLFiddle

Hinweis: Ich bin ein wenig verwirrt darüber, wie sollte ich meine Frage so geben Sie bitte bearbeiten es tun, wenn Sie möchten. :)

+1

GROUP BY, wählen Fall zählen etc – jarlh

Antwort

6

können Sie verwenden case mit distinctOS Wert count für jede ShopName Prüfung:

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

SQLFiddle

+1

Sie können nicht IIF in SQL Server 2008. Es wurde im Jahr 2012 implementiert. Es kann mit CASE obwohl –

+0

@ t-clausen.dk geschrieben werden: danke, habe die Version nicht bemerkt. – potashin

+1

Ich werde dies als die Antwort auf diese Frage markieren, da mein erster Gedanke ist, count() zu verwenden. :) – 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

Dieser Fehler zurück, werden Sie eine Aggregatfunktion auf OS verwenden müssen in Ihren Subselect –

4

Das ist einfach: Da Sie eine Zeile pro Geschäft haben möchten, gruppieren Sie nur nach Shop. Dann rufen Sie das Betriebssystem mit einer Aggregatfunktion ab. Dies kann MIN oder MAX sein. Wenn Sie jedoch MIN <> MAX erkennen, müssen Sie stattdessen "Mixed" anzeigen.

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

Wie in Frage habe ich erwähnt, gegeben haben sowohl die Ausgaben für den erwarteten

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

Erstes Ergebnis

;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 

Und gesetzt Endergebnis

;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

Dies gibt das angeforderte Ergebnis nicht zurück –

Verwandte Themen