【问题标题】:Convert multiple Rows into Columns [duplicate]将多行转换为列[重复]
【发布时间】:2014-08-27 12:03:37
【问题描述】:

我有一个来自我的脚本 SQL 的表,例如:

我需要把这张表转换成:

我创建临时表:

CREATE TABLE #Table
(
  Data Date,
  Max Real,
  Min Real,
  Avg Real
)

我有一个脚本,当我的值被计算出来时:

INSERT INTO #Table (Data, Max, Min, Avg) VALUES (@Data, @Max, @Min, @Avg)

我不知道,如何将table1 转换为table2

【问题讨论】:

  • 也许this question 答案中的链接可以帮助您找到自己的方式。
  • 你需要使用pivot
  • @WingedPanther 我已经知道了,我需要使用pivot,但是我不知道如何使用pivot,我可能会成功

标签: sql sql-server rows multiple-columns


【解决方案1】:

这称为“转置”数据。

在某些数据库中,PIVOT 命令可用于此目的。当它不存在时,例如在 MySQL 中,它可以使用 GROUP BY 和有时使用纠结的 SQL 来完成,如下例所示:

然而,在您的导入脚本中进行转置通常要简单得多。

任一选项的一个关键要求是您的转置表需要固定数量的列;在您提供的示例中,情况并非如此。

这里可能更合适的替代方法是将数据原样保留在数据库中,然后在使用/查看数据的应用程序中转置。

【讨论】:

  • 谢谢,我会努力的,我可能会成功
  • 我的数据是从循环中选择的,我无法“严格”输入第二个链接中的月份
  • @Mini ,您是否有固定数量的列,即一定数量的数据点?因为如果没有,您将无法使用这些方法。一个数据库表需要预先确定的列数。
  • 我不使用固定数量的列 ehhh :/
  • 那么,正如我在答案中提到的,我建议您以这种格式将数据存储在数据库中;并在查看/显示/报告数据时进行转置。
【解决方案2】:

我很想看到这个问题的更多答案,这是我的版本

SELECT 'Data' AS [Data],* FROM (
SELECT DATA FROM #TABLE)A
PIVOT
(
MAX(DATA ) FOR DATA IN ([08:01],[08:02],[08:03],[08:04])
)B
UNION ALL
SELECT 'MAX',CONVERT(VARCHAR,[26]),CONVERT(VARCHAR,[27]),CONVERT(VARCHAR,        [28]),CONVERT(VARCHAR,[29]) FROM (
SELECT [MAX] FROM #TABLE)A
PIVOT
(
    MAX([MAX]) FOR [MAX] IN ([26],[27],[28],[29])
)B
UNION ALL
SELECT 'MIN',CONVERT(VARCHAR,[20]),CONVERT(VARCHAR,[21]),CONVERT(VARCHAR,    [22]),CONVERT(VARCHAR,[23]) FROM (
SELECT [MIN] FROM #TABLE)A
PIVOT
(
    MAX([MIN]) FOR [MIN] IN ([20],[21],[22],[23])
)B
UNION ALL
SELECT 'AVG',CONVERT(VARCHAR,[23]),CONVERT(VARCHAR,[24]),CONVERT(VARCHAR,    [25]),CONVERT(VARCHAR,[26]) FROM (
SELECT [AVG] FROM #TABLE)A
PIVOT
(
    MAX([AVG]) FOR [AVG] IN ([23],[24],[25],[26])
)B

试图附加图片,但无法做到!

【讨论】:

  • 谢谢。我会尝试这样做,但我的桌子是动态的(桌子不是 4x4)。无论我将选择时间间隔,行也是如此。注意:我的表 08.01、08.02 等不是时间,只有 8 月 1 日、8 月 2 日等。
猜你喜欢
  • 2016-09-22
  • 2010-11-13
  • 2015-08-06
  • 2013-10-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多