下午,我有以下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'。
希望这更有意义。
答案 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。