【问题标题】:SQL Server - Query. How do I split a column into 2 where the ID of rows are duplicated?SQL Server - 查询。如何将一列拆分为 2 行 ID 重复的列?
【发布时间】:2016-05-27 15:56:26
【问题描述】:

我正在汇总一份报告并加入了许多表格;在这种情况下,我试图从中提取数据的表具有重复的 ID,每个 ID 具有多个 (2) 值,就好像它们应该在 2 列中一样:

ID    Position   Caption   Value
---   --------   -------   -----
143   1          Company   QW
143   2          Invoice   Long Service
144   1          Company   IT
144   2          Invoice   Complete Kit
145   1          Company   OD
145   2          Invoice   Foundation Leaflets
146   1          Company   BIRT
146   2          Invoice   TASIT

目前我已经将它加入到另一个带有 ID 的表中,正如预期的那样,它现在复制了每一行数据,理想情况下,我想让 ID 清楚地加入并显示如下数据:

ID    Company   Invoice
---   -------   -----
143   QW        Long Service
144   IT        Complete Kit
145   OD        Foundation Leaflets
146   BIRT      TASIT

这是我当前的代码,它产生 2 列但保留重复的行...

SELECT 
CASE WHEN IR.Caption = 'Owning Company' THEN Value ELSE NULL END AS OwningCompany,
CASE WHEN IR.Caption = 'Invoice Summary' THEN Value ELSE NULL END AS InvoiceSummary
FROM Invoices AS I INNER JOIN
InvoiceReferences AS IR ON IR.InvoiceID = I.ID
WHERE        (I.InvoiceStatus = '1')

给我这些结果:

OwningCompany   InvoiceSummary
DT                  NULL
NULL            Guide to Public Sector Tendering
BIRT            NULL
NULL            Agency
BIRT            NULL
NULL            food-catering

我希望结果如下所示:

OwningCompany   InvoiceSummary
DT              Guide to Public Sector Tendering
BIRT            Agency
BIRT            food-catering

谢谢

注意,我更熟悉 MySQL 格式而不是 SQL Server Management

【问题讨论】:

    标签: sql-server join duplicates


    【解决方案1】:

    试试这样的;

    SELECT DISTINCT
    a.ID
    ,b.Value Company
    ,c.Value Invoice
    FROM Invoices a
    JOIN InvoiceReferences b
        ON a.ID = b.InvoiceID
        AND b.Caption = 'Owning Company'
    JOIN InvoiceReferences c
        ON a.ID = c.InvoiceID
        AND c.Caption = 'Invoice Summary'
    WHERE (a.InvoiceStatus = '1')
    

    【讨论】:

    • 这非常有效,谢谢!需要注意的是,在这种情况下,我不需要使用 DISTINCT(有无结果都一样)
    • 当然,我不确定原始表中的数据是否会导致重复。很高兴知道它没有。
    【解决方案2】:

    你可以试试这样的。这假定每个公司 ID 也有一个发票 ID。如果这不是真的,您可能需要进行不同的连接,并且可能使用像 coalesce 之类的东西。

    ;WITH InvoiceSummaries
    AS
    (
        SELECT ID, Value AS InvoiceSummary 
        FROM MyTable
        WHERE Caption = 'Invoice Summary'
    )
    ,OwningCompanies
    AS
    (
        SELECT ID, Value AS OwningCompany
        FROM MyTable
        WHERE Caption = 'Owning Company'
    )
    SELECT a.ID,b.OwningCompany, a.InvoiceSummary
    FROM InvoiceSummaries a
    INNER JOIN OwningCompanies b
    ON a.ID = b.ID
    

    【讨论】:

      【解决方案3】:

      你真的只需要一个group by 和一个虚拟聚合。如果我正确地遵循了您的查询,我想我将在正确的列上进行分组。我删除了else nulls,因为您并不严格需要它们,而实际上只是为了摆脱代码窗口中的滚动条。

      SELECT 
          MIN(CASE WHEN IR.Caption = 'Owning Company'  THEN Value END) AS OwningCompany,
          MIN(CASE WHEN IR.Caption = 'Invoice Summary' THEN Value END) AS InvoiceSummary
      FROM
          Invoices AS I INNER JOIN
          InvoiceReferences AS IR
              ON IR.InvoiceID = I.ID
      WHERE
          I.InvoiceStatus = '1'
      GROUP BY
          I.ID
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多