Sql 如何使用自定义值将两个值(行)组合成一行?
所以我有这个样品表。包含所有网店分支机构安装的操作系统的数据Sql 如何使用自定义值将两个值(行)组合成一行?,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,所以我有这个样品表。包含所有网店分支机构安装的操作系统的数据 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 我需要查询商店
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
我需要查询商店安装的OS
我可以使用这个查询来实现这一点
select ShopName, OS
from ShopInv
group by ShopName, OS
预期结果将是:
ShopName OS
CyberBob Win7
CyberBob WinXP
GameCity Win7
Mineski WinXP
但是,我只希望每家店铺列出一行。因此,在类似上述示例的情况下,有超过1行(由于安装了不同的OS
版本)。我只想显示混合的
结果是这样的:
ShopName OS
CyberBob Mixed
GameCity Win7
Mineski WinXP
这在SQL Server 2008上可行吗
注意:我有点困惑我该如何陈述我的问题,所以如果你愿意,请编辑它。:) 这很简单:因为您希望每家店铺有一行,所以只能按店铺分组。然后使用聚合函数获取操作系统。这可以是最小值或最大值。但是,如果检测到最小值和最大值,则必须显示“混合”
select
ShopName,
case when MIN(OS) = MAX(OS) then MIN(OS) else 'Mixed' end as OS
from ShopInv
group by ShopName;
您可以对每个
ShopName
检查使用case
和distinct
OS
值count
:
select ShopName
, case when count(distinct OS) > 1 then 'Mixed' else min(OS) end
from ShopInv
group by ShopName
如问题中所述,我已经给出了预期目标的两个输出
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')
第一个结果
;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
;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
和最终结果集
;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
;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
分组依据,选择案例计数等您不能在SQLServer2008中使用IIF。它于2012年实施。它可以用CASE重写though@t-克劳森:谢谢,我没有注意到这个版本。我将把这个标记为这个问题的答案,因为我的第一个想法是使用count()。:)是的,使用COUNT DISTINCT是一个很好的选择。我更喜欢MAX和MIN,因为在数组中很容易找到最大值或最小值,但要计算所有不同的值需要做很多工作,只是为了确定是否有多个值。但是我必须承认,我从来没有看到执行速度的真正差异,所以这最终只是个人喜好的问题。这不会返回请求的结果。这将返回一个错误,您需要在操作系统上的子选择中使用聚合函数