Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用自定义值将两个值(行)组合成一行?_Sql_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

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,因为在数组中很容易找到最大值或最小值,但要计算所有不同的值需要做很多工作,只是为了确定是否有多个值。但是我必须承认,我从来没有看到执行速度的真正差异,所以这最终只是个人喜好的问题。这不会返回请求的结果。这将返回一个错误,您需要在操作系统上的子选择中使用聚合函数