【问题标题】:Select data from 2 tables, UNPIVOT first table and join it with other table [duplicate]从2个表中选择数据,UNPIVOT第一个表并将其与其他表连接[重复]
【发布时间】:2021-08-22 11:07:51
【问题描述】:

我在 SQL 中有 2 个表,分别是 PetsCustomers

宠物桌:

Pet ID PetType
01 Dog
02 Cat
03 Mouse
04 Fish

客户表:

CustID CustName PetType IsPet
01 Cust1 Dog Y
02 Cust2 Cat Y
03 Cust3 Dog Y
04 Cust4 Fish Y
05 Cust5 Mouse Y
06 Cust6 Dog Y

我需要以这样一种方式选择记录,即客户列表与宠物的透视列连接在一起。 例如,结果应该是:

CustID CustName Dog Cat Mouse Fish
01 Cust1 Yes
02 Cust2 Yes
03 Cust3 Yes
04 Cust4 Yes
05 Cust5 Yes
06 Cust6 Yes

对于 SQL 查询的任何建议或帮助将不胜感激。

【问题讨论】:

  • 如果您不知道最终表中的列(即它们来自第一个表),那么您将需要动态 SQL。
  • 这是一个枢轴,而不是一个非枢轴。 Pivot 使用聚合将行转换为列,而 unpivot 将列转换为行(并且不需要聚合)。

标签: sql sql-server pivot dynamic-pivot


【解决方案1】:

您可以使用这样的查询来创建动态插入到表中的所有动物列表:

DECLARE @cols  AS NVARCHAR(MAX),  @query AS NVARCHAR(MAX)

SET @cols = ( SELECT STRING_AGG(QUOTENAME([PetType]),',') 
                FROM (SELECT DISTINCT [PetType] 
                        FROM [Customer] ) C );
SELECT @cols;
SET @query = 
  N'SELECT *  
      FROM [Customer]
     PIVOT 
     (
         MAX(IsPet) FOR [PetType] IN (' + @cols + N')
     ) AS p'

EXEC sp_executesql @query;

Demo

如果将文字 Y 用作 Yes 很重要,则使用子查询和条件,例如

DECLARE @cols  AS NVARCHAR(MAX),  @query AS NVARCHAR(MAX)

SET @cols = ( SELECT STRING_AGG(QUOTENAME([PetType]),',') 
                FROM (SELECT DISTINCT [PetType] 
                        FROM [Customer] ) C );

SET @query = 
  N'SELECT *  
      FROM ( SELECT (CASE WHEN [IsPet]=''Y'' THEN ''Yes'' END) AS [IsPet],
                    [CustID], [CustName],[PetType]
               FROM [Customer] ) AS c
     PIVOT 
     (
       MAX([IsPet]) FOR [PetType] IN (' + @cols + N')
     ) AS p'

EXEC sp_executesql @query;

Demo

无论如何,[Pets] 表是不需要的。

【讨论】:

    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多