SQL 服务器 table 操纵

SQL Server table manipulation

我真的是新来的。目前正在研究 SQL Server 2012。

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

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')
;

在 table A 中,对于资产 ID 和任务 ID 的每个唯一组合,我们总是有相同数量的 weeks/year。

并想将其翻译成table 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            |
+----------+---------+--------------+--------------+--------------+

有什么想法吗?

试一试此代码的大小,看看效果如何。它首先获取所有唯一的 year/weeks 然后创建一个 select 列表。然后使用动态 T-SQL 它创建一个枢轴 table 来显示你想要的布局:

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)

工作 fiddle here.