当前位置: 首页 > 知识库问答 >
问题:

MicrosoftSQL服务器:添加新列到行而不是重复值

丘浩宕
2023-03-14

以下是我的现状:

我收到了一长串数据,其中包含名称和值,以及相应的值ID。ID的数量对于呈现的数据可能会有所不同,但对于整个集合来说是恒定的。(这个集合每个名称正好有2个值)。问题是,名称重复,但ID不重复。然后我的问题变成了,

如何转换如下所示的表:

Name | ID | Value
Sam  |  1 |    15
Sam  |  2 |     6
Bob  |  1 |     9
Bob  |  2 |    11

更像这样:

Name | Value1 | Value2
Sam  |     15 |      6
Bob  |      9 |     11

注意:我很难想出这个问题的标题。

共有3个答案

法玮
2023-03-14

您需要的是一个PIVOT查询。根据您的数据集中有多少个名称,以及您是否提前知道这些名称,您可能需要一个“动态透视”。

数据透视查询可能有点令人困惑。但是这里有两个如何构建动态数据透视查询的示例。(第二个是另一个Stack Overflow问题,可能比第一个更适合您的情况。)

T-SQL:多列上的动态透视

T-SQL 动态透视

编辑:具体示例...

-- DROP TABLE #MyTable
-- CREATE TABLE #MyTable( name varchar(10), ID int, value int );

INSERT #MyTable VALUES ('Sam', 1, 15);
INSERT #MyTable VALUES ('Sam', 2, 6);
INSERT #MyTable VALUES ('Bob', 1, 9);
INSERT #MyTable VALUES ('Bob', 2, 11);
-- INSERT #MyTable VALUES ('Sam', 3, 1);
-- INSERT #MyTable VALUES ('Bob', 3, 2);


DECLARE @cols NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT 
                                '],[' + CONVERT(varchar(5), t.ID )
                        FROM    #MyTable AS t 
                        --ORDER BY '],[' + t.ID 
                        FOR XML PATH('') 
                      ), 1, 2, '') + ']' 

--SELECT  @cols

SET @query = N'SELECT name,'+ @cols +' FROM 
(SELECT t1.name, t1.ID, t1.Value FROM #MyTable AS t1) p 
PIVOT (MAX([Value]) FOR ID IN ( '+ @cols +' )) 
AS pvt;' 

EXECUTE(@query)
程鸿畅
2023-03-14

如果您可以确定该集合只有两个值,并且这些值的ID始终为1或2,则可以执行以下操作:

CREATE TABLE #Table (Name VARCHAR(5), ID INT, Value INT)
INSERT INTO #Table VALUES ('Sam', 1, 15), ('Sam', 2, 6), ('Bob', 1, 9), ('Bob', 2, 11)

SELECT  t.Name,
        t.Value AS Value1,
        t2.Value AS Value2
  FROM  #Table t
    INNER JOIN #Table t2 ON t2.Name = t.Name AND t2.ID = 2
  WHERE t.ID = 1

DROP TABLE #Table

请注意,临时表只是为了说明结果。重要的是 SELECT 语句。

这将表连接到自身以获取Value2的值。

云丰
2023-03-14

您可以使用pivot作为示例。看看这个代码片段:

SELECT pvt.Name, pvt.[1] as Value1, pvt.[2] as Value2
FROM yourTable
PIVTO (
    MAX(Value)
    FOR id IN([1],[2])
) as pvt

你只需要将你的附加ID添加到IN()SELECT中。

如果你需要一个动态支点,你可以在这里使用这个:

DECLARE @sql nvarchar(max), @columnlist nvarchar(max)

SELECT @columnlist = 
        COALESCE(@columnlist + N',['+CONVERT(nvarchar(max),cols.id)+']', 
            N'['+CONVERT(nvarchar(max),cols.id)+']'
        )
FROM (SELECT DISTINCT id FROM yourTable) as cols

-- this is your part
SET @sql = N'
    SELECT pvt.*
    FROM yourTable
    PIVTO (
        MAX(Value)
        FOR id IN('+@columnlist+')
    ) as pvt'
EXEC(@sql)
 类似资料:
  • 当您将一个项目添加到一个ObservableList中(该列表显示在TableView中)时,如何在添加重复项目时更新行? 例如,考虑一个包含三个列的TableView:项目、数量和价格。这可以通过以下代码来实现: 在其当前形式中,您可以得到如下表: 项目 --------- 数量 ----- 价格。 炒面----- 1 ----------- 4.20。 泰国-------- 1 -------

  • 我正在网上搜索住房数据,并将其放入熊猫数据目录中。我想先测试一个清单的函数,然后再继续几个清单。我唯一的问题是条目添加到DataFrame的方式。 列表信息是作为列而不是行添加的(我希望它作为行添加)。这是我正在做的。有没有更好的功能可以使用?提前感谢! 附注:位置、价格、床位等都是价值。(例如,位置可以是,价格可以是,等等)

  • 我想添加一个图像到我的页面,所以当我分享链接时,它会显示图像和描述,就像它在下面的图片中一样,或者类似的东西,所以它不仅只显示链接描述,还会显示图像。

  • 我有一个来自excel电子表格的数据框,其中我找到了每个域出现的频率。我想添加域频率计数到它的相应域。 下面是查找频率并尝试将其添加到相应域的代码。 当我从数据帧打印出频率时:

  • 我将Tomcat从版本7.0.47升级到版本8.0.0-RC5(x86),它很好(我做了测试)。 当我在NetBeans 7.4上进行新的配置以处理Tomcat 8.0.0-RC5时,它显示:指定的LocationServer文件夹(CatalinaHome)无效。 我读了一些关于降低Tomcat等级的帖子,但我想在它之前执行一些任务。也许设置一些文件...你能帮帮我吗? 马科斯

  • 我刚开始使用LDAP和Windows Server 2012。我已经设法让我的PHP代码使用管理员帐户绑定到Active Directory,但我似乎可以使用ldap_add函数创建一个新用户。 我正在运行Windows Server 2012 R2和IIS 8。我已经安装了带有企业根证书的证书颁发机构,并且能够使用ldp.exe与SSL连接连接到AD。 我已经浏览了谷歌以及“可能重复的线程”,但