【问题标题】:SQL query to export single data row to multiple CSV rows将单个数据行导出到多个 CSV 行的 SQL 查询
【发布时间】:2013-02-06 17:45:32
【问题描述】:

我们正在尝试自动化一些步骤,我需要设置一个查询来按计划转储数据。我遇到的问题是从 SQL 表中获取单行数据并将其转储到多行数据中。 SQL 表用于零件订购单,具有最多可输入 10 个零件的字段 (Part01 - Part10) 和每个零件数量的字段 (Qty01-Qty10)。和大多数订单一样,我们不会在每个订单上使用全部 10 行,所以在导出时,我们还需要测试 part 字段 (PartXX'') 中是否有数据,以便只为实际有的行生成行数据。表中还有一些字段需要填充到每个输出行中,即使它没有更改。第一个“行”的查询是直截了当的,但我的障碍是后续行的“IF/THEN”部分并为

我要找的输出是这样的:

Ticket# CustID Account Line ShipAttn ShipAdd ShipCity ShipState ShipZip 零件数量
123456 Cust01 987465 1 Joe Smith 地址 AnyTown IL 01234 Key 2
123456 Cust01 987456 2 Joe Smith 地址 AnyTown IL 01234 Lock 2

感谢任何方向。

【问题讨论】:

  • 您使用的是什么 DBMS?向我们展示您尝试过的查询、示例数据以及可能的表结构。
  • 抱歉,使用 MS SQL 2008 R2。

标签: sql sql-server-2008-r2 export-to-csv


【解决方案1】:

您正在寻找的是数据透视表(或“交叉表”)。每个 RDBMS 都有自己的解决方案,您没有提供自己的解决方案。确切的语法还取决于您的 RDBMS。

标准 SQL 查询可能如下所示:

SELECT Ticket#, CustID, Account, 1 AS Line, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part01 AS Part, Qty01 AS Qty
FROM   tbl
WHERE  Part01 IS NOT NULL

UNION ALL
SELECT Ticket#, CustID, Account, 2 AS Line, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part02 AS Part, Qty02 AS Qty
FROM   tbl
WHERE  Part02 IS NOT NULL

UNION ALL ...

ORDER BY Ticket#, CustID, Account, Line

ORDER BY 应用于完整结果,而不仅仅是查询的最后一段。因此,您不需要子选择或 CTE。

【讨论】:

    【解决方案2】:

    不知道您的确切架构,您可以尝试这样的方法来反透视您的记录:

    ;with cte as (
        -- Select for each Part/Qty:
        select Ticket#, CustID, Account, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part01 as Part, Qty01 as Qty, 1 as Line
        from Orders
        where Part01 is not null and Qty01 is not null
        union all
        select Ticket#, CustID, Account, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part02 as Part, Qty02 as Qty, 2 as Line -- 02!
        from Orders
        where Part02 is not null and Qty02 is not null -- 02!
        union all
        select Ticket#, CustID, Account, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part03 as Part, Qty03 as Qty, 3 as Line -- 03!
        from Orders
        where Part03 is not null and Qty03 is not null -- 03!
        --union all...keep going with 04 - 10
    )
    select Ticket#, CustID, Account
        , row_number() over (partition by Ticket# order by Line) as Line
        , ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part, Qty
    from cte
    order by Ticket#, Line
    

    【讨论】:

    • 我应该注意到,这是在 SQL Server 中尝试过的,因为我们不知道 OP 正在使用什么,但证明了 Line 需要一些逻辑才能找到。
    • 我一定会在我身边尝试这个作为 Edwin 帖子的替代品。谢谢!
    【解决方案3】:

    上述两个解决方案都需要联合,因为您使用的是 SQL Server 2008 R2,您可能希望使用 UnPivot 的内置功能......它仍然未经测试,但应该可以工作。

    它基于描述的解决方案:http://mangalpardeshi.blogspot.com/2009/04/unpivot-multiple-columns.html

    SELECT Ticket#, CustID, Account
        , row_number() over (partition by Ticket# order by Parts) as Line
        , ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part, Qty 
    FROM 
    ( 
    SELECT Ticket#, CustID, Account , ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip,
           Part01, Part02, Part03, Part04, Part05, Part06, Part07, Part08, Part09, Part10,
           Qty01, Qty02, Qty03, Qty04, Qty05, Qty06, Qty07, Qty08, Qty09, Qty10
    FROM Suppliers 
    ) Main
    UNPIVOT 
    ( 
    Part FOR Parts IN (Part01, Part02, Part03, Part04, Part05, Part06, Part07, Part08, Part09, Part10) 
    ) P
    
    
    UNPIVOT 
    ( 
    Qty For Qtys IN (Qty01, Qty02, Qty03, Qty04, Qty05, Qty06, Qty07, Qty08, Qty09, Qty10) 
    ) Q
    
    WHERE RIGHT(Parts,2) =  RIGHT(Qtys,2)
    

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2011-12-28
      相关资源
      最近更新 更多