从查询中传递日期到列头。

问题描述 投票:0回答:1

我在一个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 但一直找不到如何读取日期,将其修剪下来,然后对表中的所有结果执行透视。而不仅仅是指定的一组结果。

任何建议都是非常感激的

sql-server tsql date pivot dynamic-sql
1个回答
1
投票

Alex给了我解决这个问题的最后动力。这是我最后的代码,从导入文件中提取日期,将其缩短为只有月和日,然后将其插入到新表中作为列头使用。

    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'Country_Region',
            @ColumnC = 'Confirmed AS [' + @Date + ']',
            @table = N'[COVIDResearch].[dbo].[DailyImport5.30.20]'

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

    EXEC sp_executesql @sql

谢谢你的帮助


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
© www.soinside.com 2019 - 2024. All rights reserved.