【问题标题】:Create Table from Select with rows as Columns从选择创建表,以行作为列
【发布时间】:2014-04-21 13:53:39
【问题描述】:

我需要根据我的参数创建一个包含列的表。该参数是字符串变量,它由逗号分隔的多个值的月份和年份组合组成。基于这个值,我需要创建临时表。我试过如下

DECLARE @compareMonths VARCHAR(2000)
DECLARE @compareCount INT
DECLARE @cols VARCHAR(2000)
DECLARE @query AS NVARCHAR(MAX);

SET @compareMonths = '2014-01,2014-02'

select @cols =  STUFF((SELECT distinct ',' +
 CONVERT(CHAR(3), DATENAME(MONTH, CAST(
      CAST(SUBSTRING(Data, 0, 5) AS VARCHAR(4)) +
      RIGHT('0' + CAST(SUBSTRING(Data, 6, 2) AS VARCHAR(2)), 2) +
      RIGHT('0' + CAST(1 AS VARCHAR(2)), 2) 
   AS DATETIME))) + ' ' + CAST(SUBSTRING(Data, 0, 5) AS VARCHAR(4))
                      FROM dbo.Split(@compareMonths, ',')
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

在这里,我将列名设置为月份名称和年份,但如何基于此动态创建表。我没有任何值列可以使用数据透视。

我的 outout 表必须有 2 列名为 Jan 2014, Feb 2014

【问题讨论】:

  • 你需要清楚你想做什么。您想提取 csv 字符串中的所有单词,然后将它们全部插入同一列吗?另外,您面临的问题是什么?这是一个错误吗?示例表?
  • 我拆分并获得了表格,其中包含行中的值。现在我需要从这些行创建临时表。我不知道如何通过将行转换为列来创建表。我也没有其他值列可以使用枢轴

标签: sql sql-server


【解决方案1】:

如果你想要一个SQL数据库表,你可以build Dynamic SQL script形成一个CREATE TABLE脚本如下

DECLARE @compareMonths VARCHAR(2000)
SET @compareMonths = '2014-01,2014-02'

declare @sql nvarchar(max) 

SELECT @sql = isnull(@sql + ',','') + ( '[' + val + ']') + ' varchar(100)' from dbo.Split(@compareMonths, ',')

SET @sql = N'CREATE Table OutputTable (' + @sql + ')'
exec sp_executeSql @sql

select * from OutputTable

在上面的脚本中,我还使用了sql string split function,您可以在参考教程中找到源代码

最后,您的数据库中将有一个名为 OutputTable 的表,其中包含两列

【讨论】:

  • 谢谢。我使用这种方式并将我的逻辑更改更新为月份和年份
猜你喜欢
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多