将日期从查询传递到列标题

时间:2020-06-07 18:59:46

标签: sql-server tsql date pivot dynamic-sql

我正在使用COVID数据库,我想使用导入文件Last_Update列中的部分日期,并将其用作该文件中列的别名。

以下是导入文件的示例:

    FIPS    County      Province_State  Country_Region  Last_Update            Lat          Long    Confirmed   Deaths  Recovered   Active
    45001   Abbeville   South Carolina   US             2020-05-30 02:32:48.00 34.22333378-82.46170658  39      0       0           39
    22001   Acadia      Louisiana        US             2020-05-30 02:32:48.00 30.2950649 -92.41419698  401     23      0           378
    51001   Accomack    Virginia         US             2020-05-30 02:32:48.00 37.76707161-75.63234615  7       12      0           815

这是预期的结果:

    Province_State  Country_Region  05-30
    --------------------------------------
    Abruzzo         Italy           3237
    Acre            Brazil          5841
    Aguascalientes  Mexico           797
    Aichi           Japan            506

Last_Update日期列导入为2020-05-30 02:32:48.0000000,我已经使用以下代码为新列标题提取缩短的日期格式,以读取05-30

DECLARE @ColumnName VARCHAR (50)
DECLARE @Date VARCHAR (50)
DECLARE @Query AS NVARCHAR (MAX)

SET @ColumnName = (SELECT TOP 1[Last_Update] FROM [DailyImport5.30.20])
SET @Date =  SUBSTRING (@ColumnName,6,6)
PRINT @Date

接下来,我尝试将@Date的变量传递到新的列标题,但到目前为止没有任何运气:

DECLARE @ColumnA nvarchar(max),
        @ColumnB nvarchar(max),
        @ColumnC nvarchar(max),
        @ColumnName VARCHAR (50),
        @Date VARCHAR (50),
        @table nvarchar(max),
        @sql nvarchar(max)
SET @table = 'DailyImport5.30.20'
SET @ColumnName ='(SELECT TOP 1[Last_Update] FROM [COVIDResearch].[dbo].[DailyImport5.30.20])'
SET @Date = 'SUBSTRING (@ColumnName,6,6)'

SELECT  
    @ColumnA = N'Province_State',
    @ColumnB = N'Salary',
    @ColumnC = N'@Date',
    @table = N'[COVIDResearch].[dbo].[DailyImport5.30.20]'

SELECT @sql = N'SELECT ' +(@ColumnA)+','+(@ColumnB)+','+(@ColumnC)+ ' FROM '+(@table) +';'

EXEC sp_executesql @sql

我收到此错误:

必须声明标量变量“ @Date”。

我也尝试过PIVOT,但是无法找到如何读取日期,将日期进行修整,然后对表中的所有结果进行透视。不只是一组指定的结果。

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:1)

亚历克斯给了我最后的解决方案。这是我的最终代码,用于从导入文件中提取日期,将其缩短为仅一个月和一天,然后将其作为列标题插入以便在新表中使用。

df = pd.DataFrame(list_2, columns = ['a', 'b', 'c', 'd', 'Species'])
df = df.astype({"a": float, "b": float, "c": float, "d": float})
list_2 = list(df.values)

感谢您的帮助!

答案 1 :(得分:0)

如果您“打印”查询(通过PRINT @sql)并将文本复制到新的查询窗口,则会发现它在@Date列名附近存在语法错误。变量名称不能用作列名称。

您需要为现有数据列提供别名。您要做的是遵循以下几条原则:

.... Omitted for brevity
SELECT  
    @ColumnA = N'Province_State',
    @ColumnB = N'Salary',
    -- You need to give an alias to an existing column in [DailyImport5.30.20] table
    -- Note: square brackets to avoid invalid identifiers, i.e. you assign value of @Date to @ColumnC.
    @ColumnC = 'Confirmed AS [' + @Date + ']', 
    @table = N'[COVIDResearch].[dbo].[DailyImport5.30.20]'

SELECT @sql = N'SELECT ' +(@ColumnA)+','+(@ColumnB)+','+(@ColumnC)+ ' FROM '+(@table) +';'

EXEC sp_executesql @sql