Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server表操作_Sql Server_Structure_Pivot Table - Fatal编程技术网

Sql server SQL Server表操作

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 | +----------

我是新来的。目前正在使用SQL Server 2012

我有以下结构的表A(记录是完整数据表的子集):

在表A中,对于资产ID和任务ID的每个唯一组合,我们始终具有相同的周数/年数

并将其转换为表B结构:

+----------+---------+--------------+--------------+--------------+
| 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)