如何解决从 2 个表中选择数据,UNPIVOT 第一个表并将其与其他表连接
我在 SQL 中有 2 个表,分别是 Pets 和 Customers
宠物表:
宠物 ID | 宠物类型 |
---|---|
01 | 狗 |
02 | 猫 |
03 | 鼠标 |
04 | 鱼 |
客户表:
客户 ID | 客户姓名 | 宠物类型 | IsPet |
---|---|---|---|
01 | 客户 1 | 狗 | 是 |
02 | 客户 2 | 猫 | 是 |
03 | Cust3 | 狗 | 是 |
04 | Cust4 | 鱼 | 是 |
05 | Cust5 | 鼠标 | 是 |
06 | Cust6 | 狗 | 是 |
我需要以这样一种方式选择记录,即客户列表与宠物的旋转列连接。 例如,结果应该是:
客户 ID | 客户姓名 | 狗 | 猫 | 鼠标 | 鱼 |
---|---|---|---|---|---|
01 | 客户 1 | 是 | |||
02 | 客户 2 | 是 | |||
03 | Cust3 | 是 | |||
04 | Cust4 | 是 | |||
05 | Cust5 | 是 | |||
06 | Cust6 | 是 |
对于 SQL 查询的任何建议或帮助将不胜感激。
解决方法
您可以使用这样的查询来创建动态插入表中的所有动物列表:
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;
如果将文字 Y
作为 Yes
重要,则使用子查询和条件,例如
DECLARE @cols AS NVARCHAR(MAX),')
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;
无论如何,都不需要[Pets]
表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。