sql - 没有子查询的表的多次传递

标签 sql database select group-by pivot

我有一个看起来像这样的表格:

Id   Field   Value
1    Color   Red
1    Price   10.00
1    Size    S
2    Color   Red
2    Price   10.00
2    Size    M
3    Color   Red
3    Price   20.00
3    Size    L
4    Color   Yellow
4    Price   20.00
4    Size    L 

第1步:我需要将给定的表转换为包含列的表 ID、颜色、价格、尺寸,不重复,并且每个字段列不使用子查询。

第 2 步:我需要找到至少有 2 个共同值的所有 Id 对。如果添加了更多字段,查询必须是可扩展的,所以不要假设我们只有颜色、价格、尺寸。

在面试时有人问我,但我似乎无法弄清楚。

最佳答案

对于第 1 步,只需使用条件聚合:

SELECT
    id, 
    MAX(CASE WHEN field = 'Color' THEN value END) color,
    MAX(CASE WHEN field = 'Price' THEN value END) price,
    MAX(CASE WHEN field = 'Size'  THEN value END) size
FROM mytable
GROUP BY id

第 2 步看起来不像是可以在常规 SQL 中轻松完成的事情,首先是因为它意味着要处理可变数量的列。为此,正如 Gordon Linoff 所评论的,您需要使用动态 SQL,这似乎超出了您的问题范围。

关于sql - 没有子查询的表的多次传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57936170/

相关文章:

mysql - 更改 mysql 查询以组合多列而不是单独的行

sql - 计算一行中的 NULL 数

mysql - 慢sql查询优化,

sql - 在 SQL 对象表中的子类型特定属性上创建索引

c# - 从 SQLite 数据库读取非 Unicode、非英语文本

database - 如何使用 java 从安全的 kerberos 环境访问配置单元数据库

php - MySQL 查询错误 COUNT

sql - SELECT 列表中的所有列是否都必须出现在 GROUP BY 子句中

sql - 不可为空列的 UNION 可以为空

node.js - Sequelize [object SequelizeModel] 保存不是函数