Sql server SQL Server表操作
我是新来的。目前正在使用SQL Server 2012 我有以下结构的表A(记录是完整数据表的子集): 在表A中,对于资产ID和任务ID的每个唯一组合,我们始终具有相同的周数/年数 并将其转换为表B结构:Sql server SQL Server表操作,sql-server,structure,pivot-table,Sql Server,Structure,Pivot Table,我是新来的。目前正在使用SQL Server 2012 我有以下结构的表A(记录是完整数据表的子集): 在表A中,对于资产ID和任务ID的每个唯一组合,我们始终具有相同的周数/年数 并将其转换为表B结构: +----------+---------+--------------+--------------+--------------+ | Asset ID | Task ID | 2015–WEEK 19 | 2015–WEEK 20 | 2015–WEEK 21 | +----------
+----------+---------+--------------+--------------+--------------+
| Asset ID | Task ID | 2015–WEEK 19 | 2015–WEEK 20 | 2015–WEEK 21 |
+----------+---------+--------------+--------------+--------------+
| 1 | 1 | N | Y | N |
| 1 | 2 | Y | N | N |
| 2 | 1 | N | N | N |
+----------+---------+--------------+--------------+--------------+
有什么想法吗?尝试一下这段代码的大小,看看你进展如何。它首先使用所有唯一的年/周,然后创建一个选择列表。然后使用动态T-SQL创建一个透视表,以显示所需的布局:
SELECT DISTINCT CAST(IN_YEAR AS VARCHAR) + '-WEEK '+CAST(IN_WEEK AS VARCHAR) AS VALS
INTO #VALS
FROM TABLE_A
DECLARE @VALS NVARCHAR(500)
DECLARE @SQL NVARCHAR(MAX)
SELECT @VALS = COALESCE(@VALS+', ','') + '[' + VALS + ']' FROM #VALS
SET @SQL = '
;WITH CTE AS (
SELECT [ASSET ID], [TASK ID], CAST(IN_YEAR AS VARCHAR) + ''-WEEK ''+CAST(IN_WEEK AS VARCHAR) AS YEARWEEK, FLAG
FROM TABLE1)
SELECT [ASSET ID], [TASK ID], '+@VALS+'
FROM CTE
PIVOT(MAX(FLAG) FOR YEARWEEK IN ('+@VALS+')) PIV'
PRINT @SQL
EXEC (@SQL)
工作小提琴。你可能会找到你的答案……嗨,约翰尼,非常感谢你的帮助。它似乎适用于您获得的一个小数据集,但整个数据集有近100万条记录。资产ID、任务ID、年内、周内都是int类型,标志是nvarchar(1)。所以它在整个数据集上不起作用?它会抛出任何错误吗?嗨,约翰尼,在做了一些小的更新之后,它就像一个符咒!非常感谢你。我开始探索动态SQL,这对我来说是新的。
SELECT DISTINCT CAST(IN_YEAR AS VARCHAR) + '-WEEK '+CAST(IN_WEEK AS VARCHAR) AS VALS
INTO #VALS
FROM TABLE_A
DECLARE @VALS NVARCHAR(500)
DECLARE @SQL NVARCHAR(MAX)
SELECT @VALS = COALESCE(@VALS+', ','') + '[' + VALS + ']' FROM #VALS
SET @SQL = '
;WITH CTE AS (
SELECT [ASSET ID], [TASK ID], CAST(IN_YEAR AS VARCHAR) + ''-WEEK ''+CAST(IN_WEEK AS VARCHAR) AS YEARWEEK, FLAG
FROM TABLE1)
SELECT [ASSET ID], [TASK ID], '+@VALS+'
FROM CTE
PIVOT(MAX(FLAG) FOR YEARWEEK IN ('+@VALS+')) PIV'
PRINT @SQL
EXEC (@SQL)