2015-05-06 3 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') 
; 

В таблице А, мы всегда имеем такое же количество недель/год для каждой уникальной комбинации идентификатора актива и идентификатора задачи.

И хотел бы перевести его в структуру таблицы 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, TASK ID, IN_YEAR, IN_WEEK имеют тип int, FLAG - nvarchar (1). –

+0

Так что это не работает на вашем полном наборе данных? Вызывает ли это какие-либо ошибки? –

+0

HI Johnny, сделав некоторые небольшие обновления, он работает как шарм! Большое спасибо. И я добираюсь, чтобы исследовать динамический SQL, который был для меня новым. –

Смежные вопросы