2015-04-22 38 views
5

Vì vậy, tôi có bảng mẫu này. Chứa dữ liệu về những gì OS được cài đặt của tất cả các chi nhánh cửa hàng internet.Làm cách nào để kết hợp hai giá trị (hàng) thành một hàng có giá trị tùy chỉnh?

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 

Tôi cần truy vấn OS được cài đặt bởi Cửa hàng.

Tôi có thể thực hiện việc này bằng truy vấn này.

select ShopName, OS 
from ShopInv 
group by ShopName, OS 

kết quả dự kiến ​​sẽ là:

ShopName OS 
CyberBob Win7 
CyberBob WinXP 
GameCity Win7 
Mineski  WinXP 

Tuy nhiên, tôi chỉ muốn 1 hàng mỗi cửa hàng để được liệt kê. Vì vậy, trong trường hợp có nhiều hơn 1 hàng (do khác nhau OS phiên bản được cài đặt) như mẫu ở trên. Tôi chỉ muốn hiển thị Hỗn hợp.

Vì vậy, kết quả sẽ là một cái gì đó như thế này:

ShopName OS 
CyberBob Mixed 
GameCity Win7 
Mineski  WinXP 

Đây có phải là khả thi trên SQL Server 2008?

SQLFiddle

Lưu ý: Tôi là một chút nhầm lẫn về cách tôi nên nói rõ câu hỏi của tôi vì vậy hãy làm chỉnh sửa nó nếu bạn muốn. :)

+1

GROUP BY, đếm chọn trường hợp vv – jarlh

Trả lời

6

Bạn có thể sử dụng case với distinctOS giá trị count cho mỗi lần kiểm tra ShopName:

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

SQLFiddle

+1

bạn không thể sử dụng IIF trong sqlserver 2008. Nó được thực hiện vào năm 2012. Nó có thể được viết lại với CASE mặc dù –

+0

@ t-clausen.dk: cảm ơn bạn, đã không nhận thấy phiên bản. – potashin

+1

Tôi sẽ đánh dấu đây là câu trả lời cho câu hỏi này vì suy nghĩ đầu tiên của tôi là sử dụng 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

này sẽ trả về một lỗi, bạn cần phải sử dụng một chức năng tổng hợp về hệ điều hành trong bạn subselect –

4

Điều này thật dễ dàng: Vì bạn muốn có một hàng cho mỗi cửa hàng, nhóm theo cửa hàng. Sau đó nhận được hệ điều hành với một hàm tổng hợp. Điều này có thể là MIN hoặc MAX. Tuy nhiên, nếu bạn phát hiện ra rằng MIN <> MAX, thì bạn phải hiển thị 'Hỗn hợp' thay thế.

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

Như đề cập trong câu hỏi tôi đã cho cả đầu ra cho các dự

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

kết quả đầu tiên

;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 

Và kết quả cuối cùng thiết lập

;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

Điều này không trả lại kết quả được yêu cầu –

Các vấn đề liên quan