我在一个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
但一直找不到如何读取日期,将其修剪下来,然后对表中的所有结果执行透视。而不仅仅是指定的一组结果。
任何建议都是非常感激的
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
谢谢你的帮助
如果你 "打印 "你的查询(通过 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