首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成价格为负值的基于外部ID的ID

如何生成价格为负值的基于外部ID的ID
EN

Stack Overflow用户
提问于 2018-01-09 04:47:56
回答 2查看 33关注 0票数 0

我有这个数据集

代码语言:javascript
复制
InvoiceID     CDamount   companyname
   1             2500       NASA
   1            -2500       NASA
   2             1600       Airjet
   3             5000       Boeing
   4            -600        EXEarth
   5             8000       SpaceX
   5            -8000       SpaceX

我希望能够获得如下所示:

代码语言:javascript
复制
External ID    CDamount   companyname
   1             2500       NASA
   1-C          -2500       NASA
   2             1600       Airjet
   3             5000       Boeing
   4            -600        EXEarth
   5             8000       SpaceX
   5-C          -8000       SpaceX

我不能使用CDamount <0然后InvoiceID + '-‘+ 'C’否则InvoiceID以“外部ID”结尾的情况,因为其他一些公司也有负数,不属于这一类。

我想知道,如果InvoiceID是重复的并且CDAmount是负数,那么如何创建一个新的外部ID?

这是可能的吗?

您可以在下面创建示例数据

代码语言:javascript
复制
Create Table #Incident (
InvoiceID int,
CDamount int,
Companyname Nvarchar(255))


insert into #Incident Values (1,2500,'NASA')
insert into #Incident Values (1,-2500,'NASA')
insert into #Incident Values (2,1600,'Airjet')
insert into #Incident Values (3, 5000, 'Boeing')
insert into #Incident Values (4, -600, 'ExEarth')
insert into #Incident Values (5,8000,'SpaceX')
insert into #Incident Values (5, -8000, 'SpaceX')

这是我使用的,但正如我所提到的,因为ID号4也有负值,所以我得到了"-C“,这是我不想要的。

代码语言:javascript
复制
Select CASE WHEN T1.CDamount < 0 
            THEN  CAST(T1.InvoiceID AS nvarchar (255)) + '-' + 'C' 
            ELSE CAST(T1.InvoiceID AS nvarchar (255)) 
        END AS ExternalID,
T1.Companyname 
from #Incident AS T1
EN

回答 2

Stack Overflow用户

发布于 2018-01-09 06:14:06

因此,我基于我的SQL知识得到了这篇文章,这对我的情况很有效。我不确定这是不是一种明智的方式,但对于正在与这样的场景作斗争的人来说,这可能是一个良好的开端:

代码语言:javascript
复制
;With CTE1 AS (
SELECT Count(*) AS Duplicate, T1.InvoiceID 
From #Incident AS T1
Group by T1.InvoiceID
),
Main AS (
Select CASE WHEN  T1.CDamount < 0 AND T2.Duplicate > 1
            THEN  CAST(T1.InvoiceID AS nvarchar (255)) + '-' + 'C' 
            ELSE CAST(T1.InvoiceID AS nvarchar (255)) 
        END AS ExternalID,
        T1.InvoiceID AS count,
        T1.CDamount,
T1.Companyname 
from #Incident AS T1
Join CTE1 AS T2 ON T1.InvoiceID = T2.InvoiceID
)
SELECT * FROM Main 
票数 0
EN

Stack Overflow用户

发布于 2018-08-16 12:37:39

没有CTE的替代解决方案,使用ROW_NUMBER()函数。

代码语言:javascript
复制
SELECT
          CASE WHEN CDAmount < 0 AND RowID > 1
            THEN InvoiceID + '-C'
            ELSE InvoiceID
          END AS ExternalID
        , CDAmount
        , CompanyName
    FROM
        (
            SELECT
                      CAST(InvoiceID AS NVARCHAR(255)) AS InvoiceID
                    , CDAmount
                    , CompanyName
                    , ROW_NUMBER() OVER (PARTITION BY InvoiceID ORDER BY CompanyName) AS RowID
                FROM
                    #Incident
        ) AS SourceTable

诀窍是使用ROW_NUMBER()函数生成一个序列,该序列在InvoiceID更改时重置。下面是子查询及其结果。当CDAmount为负值且RowID大于1时使用CASE语句。

代码语言:javascript
复制
SELECT
          CAST(InvoiceID AS NVARCHAR(255)) AS InvoiceID
        , CDAmount
        , CompanyName
        , ROW_NUMBER() OVER (PARTITION BY InvoiceID ORDER BY CompanyName) AS RowID
    FROM
        #Incident

子查询结果:

代码语言:javascript
复制
+-----------+----------+-------------+-------+
| InvoiceID | CDAmount | CompanyName | RowID |
+-----------+----------+-------------+-------+
|         1 |     2500 | NASA        |     1 |
|         1 |    -2500 | NASA        |     2 |
|         2 |     1600 | Airjet      |     1 |
|         3 |     5000 | Boeing      |     1 |
|         4 |     -600 | ExEarth     |     1 |
|         5 |     8000 | SpaceX      |     1 |
|         5 |    -8000 | SpaceX      |     2 |
+-----------+----------+-------------+-------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48157831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档