列子句中带有子查询的 MS SQL Server 数据透视表

Posted

技术标签:

【中文标题】列子句中带有子查询的 MS SQL Server 数据透视表【英文标题】:MS SQL Server pivot table with subquery in column clause 【发布时间】:2012-10-26 01:42:44 【问题描述】:

我确信这是一个简单的技术,虽然我目前找不到答案!

我有

TIMESTAMP           | POINTNAME | VALUE
2012-10-10 16:00:00   AHU01       20
2012-10-10 16:00:00   AHU02       25
2012-10-10 16:00:15   AHU01       26
2012-10-10 16:00:15   AHU02       35

等等...(大约 800 个点名)

有很多点名,我不想在枢轴“FOR”的“IN”子句中列出每个点名 (如下文给出的语法)定义,但可能想使用子查询。

所以我想要的是将所有 POINTNAME 值作为具有 TIMESTAMP AND VALUE 列的列,所以我将获得一个 TIMESTAMP 值和每个 POINTNAME 的许多列,每个 POINTNAME PER TIMESTAMP 只有一个值,所以我不需要聚合任何东西,所以还是选择 max 吧?

类似:

SELECT [TIMESTAMP] FROM ( SELECT * FROM POINT_TABLE)
PIVOT( Max[Value] FOR [POINTNAME] IN (SELECT DISTINCT [POINTNAME] FROM POINT_TABLE)

会产生-

   TIMESTAMP              AHU01          AHU02
 2012-10-10 16:00:00        20             25
 2012-10-10 16:15:00        26             35

我意识到这可能没有这么简单,但希望你能得到我想要实现的目标?

枢轴语法:

SELECT <non-pivoted column>,
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
    (<SELECT query that produces the data>) 
    AS <alias for the source query>
PIVOT
(
    <aggregation function>(<column being aggregated>)
FOR 
[<column that contains the values that will become column headers>] 
    IN ( [first pivoted column], [second pivoted column],
    ... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;

【问题讨论】:

你的 shift 键好像坏了。出于某种原因,随机单词会大写。 【参考方案1】:

对于动态列数,您必须使用动态 SQL

declare
    @cols nvarchar(max),
    @stmt nvarchar(max)

select @cols = isnull(@cols + ', ', '') + '[' + T.POINTNAME + ']' from (select distinct POINTNAME from TABLE1) as T

select @stmt = '
    select *
    from TABLE1 as T
        pivot 
        (
            max(T.VALUE)
            for T.POINTNAME in (' + @cols + ')
        ) as P'

exec sp_executesql  @stmt = @stmt

SQL FIDDLE EXAMPLE

【讨论】:

然后根据结果创建新表?抱歉还是新手! 您要根据结果创建临时表吗?还是要创建一个真实的表? 我认为是一张真正的桌子,但找出两者的方法会很好! :-) 我还有一个我没有提到的简单的列,称为“质量”,当点数据没有被传达时,点名称可以具有值为 0 的“坏”质量。我将如何忽略此列但仍取零值。即时间戳|点名 |价值 |质量 2012-10-10 16:00:00 AHU01 0 坏 要插入表格有两种方法 - 1.您必须用create table 组合@stmt 并动态组合表格中的列。 2.你可以写select * into &lt;New Table_Name&gt; from ....,然后表就会被创建

以上是关于列子句中带有子查询的 MS SQL Server 数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中带条件的 Where 子句

SQL Server 数据库中带有 Group by 子句的 JPQL 不起作用

JPA 和 SQL Server 的 ORDER BY 子句中的列无效

IF 语句中带有子查询的 MySQL SELECT 语句的语法

动态执行SQL语句,拼接字符串,select中带有一个变量

Not in 子句不使用开放查询过滤 SQL Server