【问题标题】:SQL Server table manipulationSQL Server 表操作
【发布时间】:2015-05-06 15:48:43
【问题描述】:

我在这里真的很新。目前正在开发 SQL Server 2012。

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

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

有什么想法吗?

【问题讨论】:

  • 您可能会找到答案here...

标签: sql-server structure pivot-table


【解决方案1】:

试试这个代码的大小,看看你的表现如何。它首先需要所有唯一的年/周,然后创建一个选择列表。然后使用动态 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)

工作小提琴here.

【讨论】:

  • 您好约翰尼,非常感谢您的帮助。它似乎适用于您获得的小数据集,但完整的数据集有近 100 万条记录。 ASSET ID、TASK ID、IN_YEAR、IN_WEEK 是 int 类型,FLAG 是 nvarchar(1)。
  • 所以它不适用于您的完整数据集?它会抛出任何错误吗?
  • 您好 Johnny,在进行了一些小更新后,它就像一个魅力!非常感谢你。我开始探索动态 SQL,这对我来说是新的。
猜你喜欢
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2017-11-02
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多