根据行标准输入特定数据

时间:2017-02-03 16:24:26

标签: sql oracle

下午,我有以下SQL命令:

SELECT INVOICE_ID,               ITEM_ID,               订单号,               CLIENT_STATE 来自CUSTOMER_ORDER_INV_JOIN 在哪里ORDER_NO =' * 1007';

这会提取以下信息:

[在此处输入图像说明] [1]

我想要达到一个特定的标准,具体如下:

订单号:* 1007,如果所有行上的客户状态= PaidPosted,那么我需要另一列来显示' PaidPosted'在所有线上。 但是在订单号:* 1007,如果4行的客户状态=' PaidPosted'但是1行或更多行=' PostedAuth'然后我需要另一个列,其中所有行显示' PostedAuth'。但是,如果所有行都为NULL,我需要一个列,其中所有行都显示“No Invoice'。

希望这更有意义。

1 个答案:

答案 0 :(得分:0)

我认为这样可以满足您的需求。 您可以创建具有排序顺序的临时表:

CREATE TABLE #Sort_Order
(myOrder INT,
 CLIENT_STATE NVARCHAR(20)
 )

INSERT INTO #Sort_Order
VALUES(1, 'Preliminary')
INSERT INTO #Sort_Order
VALUES(2, 'PostedAuth')
INSERT INTO #Sort_Order
VALUES(3, 'PaidPosted')

然后你可以将它加入到你的表中并在其上运行RANK函数,如下所示:

SELECT
A.*,
DENSE_RANK() OVER (PARTITION BY A.ID
                   ORDER BY B.myOrder ASC) AS OrderRank
FROM #Temp A
INNER JOIN #Sort_Order B On (A.CLIENT_STATE = B.CLIENT_STATE)
WHERE A.ID = 1

这将通过RANK为您提供结果,您可以使用WHERE语句仅过滤RANK = 1

如果您的数据包含同一客户端状态的多行,则需要执行某种DISTINCT或GROUP BY。