【问题标题】:SQL query to dynamic Pivot/Transform data from tableSQL查询到动态数据透视/转换表中的数据
【发布时间】:2012-05-15 05:16:16
【问题描述】:

我有下表,

Company_ID             part_id     Serial NO
------------------    ----------- --------------
1                     BAU          BAU2512  
1                     BAU          BAU3512
1                     BAU          BAU4512
2                     BAU          BAU5512
2                     BAU          BAU6512
2                     BAU          BAU7512

我想要一个查询来返回这个

Company_id             Item#1       Item#2         Item#3   
------------------    ---------     -------------  ----------- 
1                     BAU2512       BAU3512        BAU4512
2                     BAU5512       BAU6512        BAU7512

感谢您使用 SQL Server 2008 对查询提供任何帮助

创建示例表。

-- Suppress data loading messages
SET NOCOUNT ON

-- Create Sample Data using a Table Varable
DECLARE @Company TABLE
(Company_ID int,
 part_ID varchar(30),
 SerialNO varchar(30))

-- Load Sample Data
INSERT INTO @Company VALUES (1, 'BAU', 'BAU2512')
INSERT INTO @Company VALUES (1, 'BAU', 'BAU3512')
INSERT INTO @Company VALUES (1, 'BAU', 'BAU4512')
INSERT INTO @Company VALUES (2, 'BAU', 'BAU5512')
INSERT INTO @Company VALUES (2, 'BAU', 'BAU6512')
INSERT INTO @Company VALUES (2, 'BAU', 'BAU7512')

【问题讨论】:

  • 通过下面的子查询尝试过,但 sql server 抛出多于一行返回错误,仍在战斗。 SELECT c.Company_ID, (select cc.serialNo from Company cc where cc.Company_ID = c.Company_ID) from Company c

标签: sql sql-server database sql-server-2008 tsql


【解决方案1】:

啊哈,我认为除了使用动态 sql 之外别无他法。基于这里的答案PIVOT in sql 2005

以下是适合我的解决方案。

创建表等

-- Create Sample Data using a Table Varable
create table dbo.Company
(Company_ID int,
 part_ID varchar(30),
 SerialNO varchar(30))

-- Load Sample Data
INSERT INTO Company VALUES (1, 'BAU', 'BAU2512')
INSERT INTO Company VALUES (1, 'BAU', 'BAU3512')
INSERT INTO Company VALUES (1, 'BAU', 'BAU4512')
INSERT INTO Company VALUES (2, 'BAU', 'BAU5512')
INSERT INTO Company VALUES (2, 'BAU', 'BAU6512')
INSERT INTO Company VALUES (2, 'BAU', 'BAU7512')

查询

DECLARE @sql AS varchar(max)
DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique
DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique

SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + ']'
        ,@select_list = COALESCE(@select_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + '] AS [col_' + CONVERT(varchar, PIVOT_CODE) + ']'
FROM (
    SELECT DISTINCT PIVOT_CODE
    FROM (
        SELECT Company_ID, SerialNO, ROW_NUMBER() OVER (PARTITION BY Company_ID ORDER BY SerialNO) AS PIVOT_CODE
        FROM Company
    ) AS rows
) AS PIVOT_CODES

SET @sql = '
;WITH p AS (
    SELECT Company_ID, SerialNO, ROW_NUMBER() OVER (PARTITION BY Company_ID ORDER BY SerialNO) AS PIVOT_CODE
    FROM Company
)
SELECT Company_ID, ' + @select_list + '
FROM p
PIVOT (
    MIN(SerialNO)
    FOR PIVOT_CODE IN (
        ' + @pivot_list + '
    )
) AS pvt
'

PRINT @sql

EXEC (@sql)

在这里回答:

http://sqlfiddle.com/#!3/7fd86/1

【讨论】:

  • 很好地找到了适合您的解决方案!不过,我必须说,如果您想有更好的机会在这里获得快速和有用的答案,您应该更详细地描述您的问题。例如,您的问题中没有任何内容表明您需要 dynamic 支点。在这方面,@CognitiveCarbon 的建议在我看来完全有效,尽管您自己的回答让我怀疑您已经知道 PIVOT 子句本身。这导致了您的问题的另一个问题,即您从未在其中说过您尝试过的内容(或者您所知道的内容无济于事)。
  • 请不要为了批评而批评。我经常发现遵循常见问题解答 (How to Ask) 中概述的建议对所有相关方都有利。提出问题的人更有可能及时获得高质量的帮助,回答问题的人可能会获得更有趣的回答,而寻找现成答案的人更有机会找到他们正在寻找的东西。无论如何,很高兴你回来发布你最终得到的解决方案,谢谢。
【解决方案2】:

看起来你想要一个 PIVOT 语句。看看here

【讨论】:

  • 谢谢你,关键是我最终需要的,赞成你的答案:-)
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多