当前位置: 首页 > 面试题库 >

使用sql选择的值作为另一个选择的行名

邢皓
2023-03-14
问题内容

在MSSQL服务器上,给出以下表:

TABLE values {
    int id;
    timestamp date;
    int value;
}

TABLE value_type {
    int value_id; // foreign key on values.id
    text name;
}

我可以发出类似的查询:

SELECT date, name, value
FROM values
LEFT JOIN value_type ON value_id = id;

并得到类似:

+----------+------+-------+
| date     | name | value |
+----------+------+-------+
| 01.01.10 | foo  |  1.0  |
+----------+------+-------+
| 01.01.10 | bar  |  2.0  |
+----------+------+-------+
| 02.01.10 | bar  |  4.0  |
+----------+------+-------+
| 03.01.10 | foo  |  5.0  |
+----------+------+-------+

如果我想要这样的数据,查询数据库的最有效方法是什么?

+----------+------+-------+
| date     | foo  | bar   |
+----------+------+-------+
| 01.01.10 | 1.0  |  2.0  |
+----------+------+-------+
| 02.01.10 | NULL |  4.0  |
+----------+------+-------+
| 03.01.10 | 5.0  |  NULL |
+----------+------+-------+

数据库结构要复杂得多,不幸的是我无法更改它。

编辑 :解决方案不应在查询中使用foobar作为硬编码值。


问题答案:

对于SQL Server 2005+,可以使用动态SQL和PIVOT

DECLARE @ValuesNames NVARCHAR(4000), @Query NVARCHAR(MAX)
SET @ValuesNames = ''

SELECT @ValuesNames = @ValuesNames + QUOTENAME([name]) + ','
FROM [values] A
INNER JOIN value_type B
ON B.value_id = A.id
GROUP BY [name]
ORDER BY [name]

SET @ValuesNames = LEFT(@ValuesNames,LEN(@ValuesNames)-1)

SET @Query = '
SELECT [date], '+@ValuesNames+'
FROM (  SELECT [date], [name], value
        FROM [values]
        LEFT JOIN value_type ON value_id = id) A
PIVOT(SUM(value) FOR [name] IN ('+@ValuesNames+')) AS PT
'
EXEC sp_executesql @Query


 类似资料:
  • 问题内容: 我有一个旧的用户信息表(仍在使用中),并且不能更改- 时区/语言/国家等只是名称的示例,它们可以是可变的/除了该列的行上的唯一列表外,没有其他任何有限列表 我需要一个MySQL兼容的SQL查询,该查询将返回- 我已经研究了关于将数据透视表功能窃取到MySQL的关于stackoverflow的各种答案,类似的方法,但是似乎没有一个比从相同表的列的唯一行值使用变量列名别名的情况更好。尽管我

  • 问题内容: 我有一个带有列名称的数据表: 其中“列”包含数字值,“期间”列是具有1到48的标识列,因此有48行。 我想将此表按摩成一种格式,在该格式中,我具有“名称”列和“值”列以及“期间”列。 我想创建原始表的视图来执行此操作吗?如何选择列名称,并将其以及该列中的正确值放入NameOfVehicle和Value列中? 问题答案: 如果您有固定的列,则始终可以执行以下操作: 如果列是动态的或未知的

  • 问题内容: 我正在寻找一个SQL查询来选择所有未由同一表上的另一个查询选择的记录。具体来说,我想选择所有具有特定字段(’fieldA’)重复项的记录,然后删除除其中一个记录以外的所有记录。 因此,一条select语句可能类似于以下内容(不起作用!): 如果不可能进行单个查询,那么最有效的解决方案是什么? 问题答案: 具体来说,我想选择所有具有特定字段(’fieldA’)重复项的记录,然后删除除其中

  • 问题内容: 如何将此SQL查询转换为Django ORM语句? 请帮助!:) ps ,不受或限制 问题答案: 使用两个QuerySet,如docs所示。

  • 问题内容: 我正在使用创建一个解决方案,而选择应该只包含另一个中不包含的选项。防爆 要通过另一个值进行过滤,我该怎么办? 问题答案: 劳拉(Laura)的上述答案在编写自定义filterOption函数时中断了过滤(如果您不希望Select可过滤,那么可能就可以了)。 一个更简单的解决方案是,对通过的应用仅应用一个简单的过滤器,而不是对第二个“选择”应用。 工作实例

  • 我有两个表和 names表有以下列表: -男性姓名从nameID 1到nameID 10 -女性姓名从nameID 11到nameID 21 -两者都从nameID 23到nameID 31 性别表有三个属性: -女性 -男性 -两者 我正在使用引导选择选项,我想显示从nameID11到nameid21的名称,如果用户从gender选择选项中选择女性,等等,这是可能的吗?我看到其他帖子,我注意到他