【问题标题】:How to create two different value in the same row如何在同一行中创建两个不同的值
【发布时间】:2020-09-19 12:14:57
【问题描述】:

以下是我正在处理的数据集。

我正在尝试根据特定条件创建新列。下面是代码:-

SELECT
  *
,
CASE
WHEN [Partner Number] Like ('SAL%') THEN [Partner Name] 
ELSE ''
END AS [SAL Name],
    CASE
WHEN [Partner Number] Like ('SAL%') THEN [Partner Email Address] 
ELSE ''
END AS [SAL Email],
CASE
WHEN [Partner Number] Like ('CEO%') THEN [Partner Name] 
ELSE ''
END AS [CEO Name],
    CASE
WHEN [Partner Number] Like ('CEO%') THEN [Partner Email Address] 
ELSE ''
END AS [CEO Email],
    CASE
WHEN [Partner Number] Like ('VPS%') THEN [Partner Name] 
ELSE ''
END AS [VPS Name],
    CASE
WHEN [Partner Number] Like ('VPS%') THEN [Partner Email Address] 
ELSE ''
END AS [VPS Email]

     Into #Partner
  from (
         Select distinct  [Vendor Number],
[Purchasing Org],

[Partner Number],

[Partner Name]
, 
[Partner Email Address] from #Temp)k

但如果集合同时具有 SAL 和 CAL,它会生成两个不同的行。

可以在同一行生成它们,因为当我进行连接时,数据会爆炸。

理想情况下,Sal Name 和 cal Name 在同一行中。

结果

【问题讨论】:

  • 您的查询设置方式无法添加重复值。因此,重复值必须已经在您的数据集中。此外,看不到您所指的“CAL”值。
  • 关注底部的 SELECT DISTINCT 语句 - 它似乎会根据您的选择列表中的两列生成多行,这些列出乎意料地不同
  • 要么对同一个表使用多个连接,要么使用数据透视表。而且 - 如果您在查询中需要 distinct 关键字,那么您的逻辑通常有问题:)

标签: sql-server tsql case


【解决方案1】:

我认为这更像是您应该在表示层中做的事情。

但是应该这样做:

WITH cte_cat
as
(
    SELECT *,   CASE    WHEN partnerNumber like 'CEO%' THEN 'CEO' 
                        WHEN partnerNumber like 'SAL%' THEN 'SAL'
                        ELSE 'OTHER' END as Category

    FROM #yourtable
),
cte_rn
as
(
    SELECT *,ROW_NUMBER () OVER (PARTITION BY vendorNbr,purchasingOrg,Category ORDER BY Commodity) as RN
    FROM cte_cat
)

SELECT oth.vendorNbr,oth.purchasingOrg,oth.commodity,oth.partnerNumber,oth.PartnerName,oth.ParterEmail,CEO.partnerNumber,CEO.PartnerName,CEO.ParterEmail,SAL.partnerNumber,SAL.PartnerName,SAL.ParterEmail
FROM cte_rn oth
LEFT JOIN cte_rn CEO
    ON CEO.Category = 'CEO'
    AND oth.RN = CEO.rn
    AND oth.vendorNbr=CEO.vendorNbr
    AND oth.purchasingOrg = CEO.purchasingOrg
LEFT JOIN cte_rn SAL
    ON SAL.Category = 'SAL'
    AND oth.RN = SAL.rn
    AND oth.vendorNbr=SAL.vendorNbr
    AND oth.purchasingOrg = SAL.purchasingOrg

WHERE oth.Category ='OTHER';

【讨论】:

  • 如果合作伙伴编号在 SAL 和 CEO 中,它还会为每个供应商创建一个空行。如何避免这种情况
猜你喜欢
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多