【问题标题】:SQL Server 2008 Combine two rows into oneSQL Server 2008 将两行合二为一
【发布时间】:2014-08-27 12:53:14
【问题描述】:

到目前为止,我已经编写了非常简单的查询,因此我现在正在寻找帮助来编写 SQL 语句,以便它将表中的两个单独的句点结束行合并为一行。这些行基本上可以通过它们的 PId、Region、Market、Code、Source 进行匹配。例如-

如果第一行是:

Id   Region Market  CODE    Source  Period_End  Amt     Pct
100 CAN     CABLE   V1      SA      20120930    100.00  0.2

第二行是:

Id  Region  Market  CODE    Source  Period_End  Amt     Pct 
100 CAN     CABLE   V1      SA      20121231    200.00  0.5

那么 SQL 应该返回这个结果:

Id  Region  Market  CODE    Source  Period_End_1    Amt_1   Pct_1   Period_End_2    Amt_2   Pct_2

100 CAN     CABLE   V1      SA      20120930        100.00  0.2     20121231        200.00  0.5

非常感谢您的帮助。

安娜。


感谢您的回复。这是我开始的,但我不确定我的方向是否正确。我还注意到,由于我会根据 Period End 在行中添加越来越多的信息,因此下面的查询将太长,并且每个选择中都有多余的“案例条件”。

select 
    A.id , A.region, A.market, A.code, A.source ,  
    case when period_end = @day_id1 then period_end else '' end as Period_End_1,
    case when period_end = @day_id2 then period_end else '' end as Period_End_2, 
    case when period_end = @day_id1 then Amt else 0.0 end as Amt_1,
    case when period_end = @day_id2 then Amt else 0.0 end as Amt_2, 
    case when period_end = @day_id1 then Pct else 0.0 end as Pct_1,
    case when period_end = @day_id2 then pct else 0.0 end as Pct_2, 
from 
    products A with (nolock)
where 
    A.product_id in (select product_id from #products) -- temp table holding multiple Ids

【问题讨论】:

  • 您说您正在寻求帮助,但您没有给我们任何帮助,除非我们只是为您编写查询。您是否有一些现有的代码或错误消息要分享,我们可以帮助修复?

标签: sql sql-server-2008


【解决方案1】:

如果我正确理解了您的问题,那么您正在尝试将pivot 多行分成多列。

假设您尝试合并的始终是 2 行,使用 period_end 字段从第二行排序第一行,然后使用 maxcasepivot 您的结果应该是这样的:

WITH CTE AS (
    SELECT *, 
           Row_Number() Over (Partition By Id, Region, Market, Code, Source 
                              Order By Period_End) rn
    FROM YourTable
)
SELECT Id, 
    Region, 
    Market, 
    Code,   
    Source,
    max(case when rn = 1 then Period_End end) Period_End_1,
    max(case when rn = 1 then Amt end) Amt_1,
    max(case when rn = 1 then Pct end) Pct_1,
    max(case when rn = 2 then Period_End end) Period_End_2,
    max(case when rn = 2 then Amt end) Amt_2,
    max(case when rn = 2 then Pct end) Pct_2
FROM CTE
GROUP BY Id, Region, Market, Code, Source

如果您有更多潜在的period_end 日期,那么您可能需要使用动态 sql 来实现您的结果。

【讨论】:

  • 我总是有两个日期之一,所以我很确定我不需要动态 sql。
【解决方案2】:
SELECT t1.Id  
      ,t1.Region  
      ,t1.Market  
      ,t1.CODE    
      ,t1.Source
      ,t1.Period_End  AS Period_End_1 
      ,t1.Amt         AS Amt_1
      ,t1.Pct         AS Pct_1
      ,t2.Period_End  AS Period_End_2 
      ,t2.Amt         AS Amt_2
      ,t2.Pct         AS Pct_2
FROM Table_Name t1 
INNER JOIN TABLE_Name t2  ON t1.ID = t2.ID
WHERE t1.ID = 100 AND t1.Period_End <> t2.Period_End

【讨论】:

  • 加入应该在Id, Region, Market, Code, Sourcet1.PeriodEnd &lt;&gt; t2.PeriodEnd 上,如果你只加入id,该行也总是会加入自己
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 2020-11-26
  • 2017-09-24
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2020-08-25
  • 2016-11-28
相关资源
最近更新 更多