Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 我怎样才能有UNION列别名?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 我怎样才能有UNION列别名?

Sql 我怎样才能有UNION列别名?,sql,sql-server,tsql,Sql,Sql Server,Tsql,很抱歉这个糟糕的标题,我想不出更好的了。请随意编辑 我必须使用一个db表,该表使用一列来存储不同类型的信息:姓氏(如果是个人),公司名称(如果是公司)。我知道这是一场噩梦,但事实就是这样 为了区分其含义,还有一列包含整数,用于指定名称列中内容的类型 此表的架构如下所示: ID int dtype int name varchar(50) 因此,一个样本可以如下所示: ID dtype name --------------------------- 1 0

很抱歉这个糟糕的标题,我想不出更好的了。请随意编辑

我必须使用一个db表,该表使用一列来存储不同类型的信息:姓氏(如果是个人),公司名称(如果是公司)。我知道这是一场噩梦,但事实就是这样

为了区分其含义,还有一列包含整数,用于指定名称列中内容的类型

此表的架构如下所示:

ID int
dtype int
name varchar(50)
因此,一个样本可以如下所示:

ID       dtype       name
---------------------------
1        0           Smith
2        0           Trump
3        1           ABC Ltd.
4        1           XYZ Ltd.
我尝试使用以下T-SQL代码对此进行规范化:

WITH companies AS 
 (
  SELECT ID, name AS company 
  FROM nametable WHERE dtype=1
  ),
      people AS 
  (
  SELECT ID, name AS person 
  FROM nametable WHERE dtype=0
  ),
  SELECT * FROM companies UNION ALL SELECT * FROM people;
我希望得到的是一个具有模式的新表:

ID
dtype
company
person
或者,在表视图中:

ID       dtype       person        company
------------------------------------------
1        0           Smith
2        0           Trump
3        1                         ABC Ltd.
4        1                         XYZ Ltd.
取而代之的是,这个字段现在只被称为person而不是name,但它仍然只是一个字段,用于存储两种类型的信息

我知道我可以创建一个新表并将每个部分结果插入其中,但似乎应该有一种更简单的方法。谢谢你的建议

您根本不需要使用UNION。更好的方法是使用一些聚合

SELECT ID,
       MAX(CASE WHEN dtype = 0 THEN [name] END) AS company
       MAX(CASE WHEN dtype = 1 THEN [name] END) AS person 
FROM nametable
GROUP BY ID;  
不过,UNION ALL并不关心别名。它将接收到的数据集合并为1。所有数据集必须具有相同的定义,并且返回的数据集将具有相同的定义。如果数据集的列具有不同的别名,则将使用第一个数据集中提供的别名。UNION不会检测到数据集的列名称不同,因此会将不同的名称作为不同的列返回;这不是工会的工作

编辑:这将为OP提供他们想要的数据,但是,不需要聚合。我被真诚地期望ID是一个共享资源;因为这通常是你唯一一次有这么糟糕的桌子。事实上,它不仅使这个表更加混乱…

您根本不需要使用UNION。更好的方法是使用一些聚合

SELECT ID,
       MAX(CASE WHEN dtype = 0 THEN [name] END) AS company
       MAX(CASE WHEN dtype = 1 THEN [name] END) AS person 
FROM nametable
GROUP BY ID;  
不过,UNION ALL并不关心别名。它将接收到的数据集合并为1。所有数据集必须具有相同的定义,并且返回的数据集将具有相同的定义。如果数据集的列具有不同的别名,则将使用第一个数据集中提供的别名。UNION不会检测到数据集的列名称不同,因此会将不同的名称作为不同的列返回;这不是工会的工作


编辑:这将为OP提供他们想要的数据,但是,不需要聚合。我被真诚地期望ID是一个共享资源;因为这通常是你唯一一次有这么糟糕的桌子。事实上,它不仅使这个表格更加混乱…

似乎你需要一个案例来帮助你

   select ID, dtype,case when dtype=0 then name end AS company,
   case when dtype=1 then name end  AS person
   FROM nametable 

CASE语句遍历条件并在满足条件时返回一个值,从您的示例输入和输出中可以清楚地看出您想要创建类型相关的新列,因此我使用了CASE语句,似乎您需要CASE when来帮助您

   select ID, dtype,case when dtype=0 then name end AS company,
   case when dtype=1 then name end  AS person
   FROM nametable 

CASE语句遍历条件并在满足条件时返回一个值,从您的示例输入和输出中可以清楚地看出您想要创建类型相关的新列,因此我使用CASE语句

共享示例输入和输出标题中问题的答案是:您没有。列名取自联合中的第一个源。所有行都必须有一个架构,即相同的数据类型以相同的顺序排列,尽管列名可能不同。如果你想把一列分成几列,你需要使用答案中展示的技巧之一。谢谢你的评论。分享示例输入和输出标题中问题的答案是:你没有。列名取自联合中的第一个源。所有行都必须有一个架构,即相同的数据类型以相同的顺序排列,尽管列名可能不同。如果您想将一列拆分为几列,您需要使用答案中演示的技巧之一。谢谢您的评论。相信我,表格会比这更令人困惑谢谢你的回答。相信我,这张桌子比这更让人困惑谢谢你的回答。虽然这对我帮助很大,但如果你能详细说明这是解决方案的时间和原因,这将是未来的参考。虽然这对我帮助很大,但如果你能详细说明这是解决方案的时间和原因,这将是未来的参考。