【问题标题】:SQL query to return matrixSQL查询返回矩阵
【发布时间】:2014-08-21 07:27:16
【问题描述】:

我有一组包含一列实际数据的行。目标是以矩阵格式显示此数据。列数保持不变,行数可能不同。

例如:

  • 我有 20 条记录。如果我有 5 列 - 那么行数将是 4
  • 我有 24 条记录。我有 5 列,行数为 5,第 5 行中的第 5 列为空。
  • 我有 18 条记录。我有 5 列,行数为 4,第 4 行中的第 4 列和第 5 列为空。

我正在考虑针对每一行生成一个列值。此列值将在 5 行后重复。但我不能解决的问题是“为变量赋值的 SELECT 语句不能与数据检索操作结合使用”

不确定如何实现。

任何建议都会有所帮助。

进一步添加 - 我已经设法生成与列名称和值关联的名称值。示例 -
Name1 Col01
Name2 Col02
Name3 Col03
Name4 Col01
Name5 Col02

【问题讨论】:

  • 请提供一些样本数据和预期结果
  • 您希望在 SQL 返回结果或在 Web 上显示结果时将列拆分为多个部分?
  • 我会在客户端程序中而不是在 sql 中这样做

标签: sql sql-server


【解决方案1】:

您可以使用ROW_NUMBER 分配从0 开始的连续整数。然后按整数除法的结果分组,同时以余数为中心。

WITH T AS
(
SELECT number, 
        ROW_NUMBER() OVER (ORDER BY number) -1 AS RN
FROM master..spt_values
)
SELECT MAX(CASE WHEN RN%5 = 0 THEN number END) AS Col1,
       MAX(CASE WHEN RN%5 = 1 THEN number END) AS Col2,
       MAX(CASE WHEN RN%5 = 2 THEN number END) AS Col3,
       MAX(CASE WHEN RN%5 = 3 THEN number END) AS Col4,
       MAX(CASE WHEN RN%5 = 4 THEN number END) AS Col5
FROM T
GROUP BY RN/5
ORDER BY RN/5

【讨论】:

  • 太棒了。谢谢,帮了大忙。
  • 您能提供进一步的帮助吗?有没有办法防止为不存在条目的行返回 NULL。详细说明 - 如果我有一个 5X5 矩阵并且表中有 23 条记录。我应该如何防止返回 NULL。提前致谢!
【解决方案2】:

一般:

  • SQL 用于检索数据,即一列中的所有 X 记录
  • 漂亮地显示您的数据通常是查询 SQL 的软件的工作,例如您的网络/桌面应用程序。

但是,如果您真的想在 SQL 中构建显示输出,您可以将WHILE 循环与LIMITPIVOT 结合使用。您只需选择前 5 条记录,然后选择下一条直到完成。

这里是一个如何使用WHILE的例子:http://msdn.microsoft.com/de-de/library/ms178642.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2014-09-18
    • 2012-11-03
    • 2021-05-11
    • 2022-01-23
    相关资源
    最近更新 更多