2015-05-06 57 views
-1

我真的很新。目前工作的SQL Server 2012年SQL Server表操作

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

CREATE TABLE [dbo].[TABLE_A](
    [ASSET ID] [float] NULL, 
    [TASK ID] [float] NULL, 
    [IN_YEAR ] [float] NULL, 
    [IN_WEEK] [float] NULL, 
    [FLAG] [nvarchar](1) NULL 
) ON [PRIMARY] 

INSERT INTO TABLE_A 
    ([ASSET ID], [TASK ID], [IN_YEAR], [IN_WEEK], [FLAG]) 
VALUES 
    (1, 1, 2015, 19, 'N'), 
    (1, 1, 2015, 20, 'Y'), 
    (1, 1, 2015, 21, 'N'), 
    (1, 2, 2015, 19, 'Y'), 
    (1, 2, 2015, 20, 'N'), 
    (1, 2, 2015, 21, 'N'), 
    (2, 1, 2015, 19, 'N'), 
    (2, 1, 2015, 20, 'N'), 
    (2, 1, 2015, 21, 'N') 
; 

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

有什么想法?

+0

你可能会发现你的答案[这里](http://stackoverflow.com/questions/13372276/simple-way-to-transpose-columns-and-rows-in-sql)... –

回答

0

给这段代码尝试一下尺寸,看看你如何继续。它首先采用所有独特的年份/周,然后创建一个选择列表。然后使用动态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], '[email protected]+' 
FROM CTE 
PIVOT(MAX(FLAG) FOR YEARWEEK IN ('[email protected]+')) PIV' 
PRINT @SQL 
EXEC (@SQL) 

工作小提琴here

+0

嗨约翰尼,谢谢这么多的帮助。它似乎与你得到的一个小数据集一起工作,但完整的数据集有近1百万条记录。 ASSET ID,TASK ID,IN_YEAR,IN_WEEK是int类型,FLAG是nvarchar(1)。 –

+0

因此它不适用于您的完整数据集?它会抛出任何错误吗? –

+0

HI约翰尼在做了一些小小的更新之后,就像一个魅力!非常感谢你。我开始探索对我而言新的动态SQL。 –