多行到一行sql

Posted

技术标签:

【中文标题】多行到一行sql【英文标题】:Multi row to a row sql 【发布时间】:2016-08-04 09:50:44 【问题描述】:

我有一张如下表:

我希望查询打印输出如下:

【问题讨论】:

欢迎您。你试过什么?你被困在哪里了?请参考:How to Ask 这 3 行的 Pod_ID 是否相同?如果突然出现具有相同 id 的第 4 行,预期的结果是什么? 是的,这 3 行的 Pod_ID 相同。我想要动态查询,如果有第 4 行将显示 Pur_Qty3、Pur_Price3、ETD_Date3。 【参考方案1】:

注意: 请不要投反对票。我知道发布答案的规则,但是对于这样的问题,没有机会发布简短的答案。我发布它只是为了为那些想要了解如何实现这一目标的人提供帮助,但并不期望 即用型 解决方案。

我建议阅读这些文章:

PIVOT on two or more fields in SQL ServerPivoting on multiple columns - SQL Server Pivot two or more columns in SQL Server 2005

【讨论】:

【参考方案2】:

首先是 UNPIVOT,然后是 PIVOT。如果每个Pod_ID 的行数并不总是等于 3,那么您需要使用动态 SQL。基本样本:

SELECT *
FROM (
    SELECT  Pod_ID,
            Purs + CASE WHEN RN-1 = 0 THEN '' ELSE CAST(RN-1 as nvarchar(10)) END as Purs,
            [Values]
    FROM (
        SELECT  Pod_ID, 
                Pur_Qty, --All columns that will be UNPIVOTed must be same datatype
                Pur_Price, 
                CAST(ETD_Date as int) ETD_Date, -- that is why I cast date to int
                ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as RN
        FROM YourTable
        ) as p1
    UNPIVOT (
        [Values] FOR [Purs] IN(Pur_Qty, Pur_Price, ETD_Date)
    ) as unpvt
    ) as p2
PIVOT (
    MAX([Values]) FOR Purs IN (Pur_Qty,Pur_Price,ETD_Date,Pur_Qty1,Pur_Price1,ETD_Date1,Pur_Qty2,Pur_Price2,ETD_Date2)
) as pvt 

会给你带来:

Pod_ID                                  Pur_Qty Pur_Price   ETD_Date    Pur_Qty1    Pur_Price1  ETD_Date1   Pur_Qty2    Pur_Price2  ETD_Date2
F8E2F614-75BC-4E46-B7F8-18C7FC4E5397    24      22          20160820    400         33          20160905    50          44          20160830

【讨论】:

以上是关于多行到一行sql的主要内容,如果未能解决你的问题,请参考以下文章

sql一行拆分多行记录

T-SQL 合并多行数据显示到一行

SQL:将一行分成多行(规范化)

将多行查询粘贴到 BigQuery SQL shell

SQL 多行多列数据清洗合并为一行

数据库多行拼接到一行Oracle和sqlServer