如何清空具有相同列详细信息的其他行

How to blank other rows having same column detail

您好,下面是我的 sql 查询

SELECT 
o.OrderNumber, 
oi.Sku, 
Sum(Isnull(oi.Price * oi.Quantity,0)) as Price, 
DENSE_RANK() over(partition by o.orderNumber order by oi.sku) as CouponRowId
from ac_OrderItems oi 
inner join ac_Orders o on oi.OrderId = o.OrderId
Inner Join ac_OrderShipments os on oi.OrderShipmentId =os.OrderShipmentId
WHERE (oi.OrderItemTypeId IN (5))
group by o.OrderNumber, oi.Sku 

下面是我得到的记录

OrderNumber    Sku           Price     CouponRowId
90061          BLACKBERRY   -5.6900    1
90061          LEMON        -5.6900    2
90061          PEACH        -5.6900    3
90061          SHIP100      -10.920    4

但我希望我的记录为

OrderNumber    Sku           Price     
90061          BLACKBERRY   -5.6900    
               LEMON        -5.6900    
               PEACH        -5.6900   
               SHIP100      -10.920    

我希望如果在这种情况下订单号相同,所有详细记录都应排在第一行,然后在其他记录之后应仅显示 Sku 和价格,而且我们还需要删除 DENSE_RANK()专栏

看到您的评论,这是在查询本身上解决问题的尝试(我假设 CouponRowID 可以完成这项工作,如果 OrderNumber 是唯一的):

WITH
    tmp AS (
               SELECT o.OrderNumber, oi.Sku, SUM(ISNULL(oi.Price * oi.Quantity, 0)) AS Price, DENSE_RANK() OVER (PARTITION BY o.orderNumber ORDER BY oi.sku) AS CouponRowId
               FROM ac_OrderItems oi
                    INNER JOIN ac_Orders o ON oi.OrderId=o.OrderId
                    INNER JOIN ac_OrderShipments os ON oi.OrderShipmentId=os.OrderShipmentId
               WHERE(oi.OrderItemTypeId IN (5))
               GROUP BY o.OrderNumber, oi.Sku
           )
SELECT CASE WHEN tmp.CouponRowId=1 THEN tmp.OrderNumber END AS OrderNumber, tmp.Sku, tmp.Price
FROM tmp
ORDER BY tmp.OrderNumber, tmp.SKu;

By seeing the query seems like Partition Clause can help you to resolve the issue. Please look at the below query. I am not so sure about the data model, but looks like you need to partition by using the OrderNumber column. Please replace the query in the first CTE with your actual table which will be like the second query. I cant test it since I don't have the environment. Please test the query

;WITH CTE_Table
AS
(
SELECT 90061 'OrderNumber' , 'BLACKBERRY' Sku,   -5.6900 'Price',   1 'CouponRowId' UNION
SELECT 90061, 'LEMON', -5.6900, 2  UNION
SELECT 90061, 'PEACH', -5.6900, 3  UNION
SELECT 90061, 'SHIP100', -10.920, 4 UNION
SELECT 90062 'OrderNumber' , 'BLACKBERRY' Sku,   -5.6900 'Price',   1 'CouponRowId' UNION
SELECT 90062, 'LEMON', -5.6900, 2  UNION
SELECT 90062, 'PEACH', -5.6900, 3  UNION
SELECT 90062, 'SHIP100', -10.920, 4 
),
CTE_New
AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY OrderNumber ORDER BY OrderNumber) Patrn FROM CTE_Table
)
SELECT CASE WHEN Patrn =1 THEN CONVERT(VARCHAR(10),OrderNumber) ELSE '' END OrderNumber, Sku, Price, CouponRowId FROM CTE_New



;WITH CTE_Table
AS
(
SELECT 
o.OrderNumber, 
oi.Sku, 
Sum(Isnull(oi.Price * oi.Quantity,0)) as Price, 
DENSE_RANK() over(partition by o.orderNumber order by oi.sku) as CouponRowId
from ac_OrderItems oi 
inner join ac_Orders o on oi.OrderId = o.OrderId
Inner Join ac_OrderShipments os on oi.OrderShipmentId =os.OrderShipmentId
WHERE (oi.OrderItemTypeId IN (5))
group by o.OrderNumber, oi.Sku 
),
CTE_New
AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY OrderNumber ORDER BY OrderNumber) Patrn FROM CTE_Table
)
SELECT CASE WHEN Patrn =1 THEN CONVERT(VARCHAR(10),OrderNumber) ELSE '' END OrderNumber, Sku, Price, CouponRowId FROM CTE_New

对不起……!我无法理解你的解释.. 我工作只是为了得到你期待的OP...

create table #ac_OrderItems(id varchar(20) --varchar, i used instead of int.Beside, varchar is easy to change to int. 
, Sku varchar(20), Price decimal, CouponRowId int)

insert into #ac_OrderItems values(
90061 , 'BLACKBERRY' ,   -5.6900 , 1)
,(90061, 'LEMON', -5.6900, 2  )
,(90061, 'PEACH', -5.6900, 3  )
,(90061, 'SHIP100', -10.920, 4 )
,(90062 , 'BLACKBERRY' ,-5.6900 ,   1  )
,(90062, 'LEMON', -5.6900, 2  )
,(90062, 'PEACH', -5.6900, 3  )
,(90062, 'SHIP100', -10.920, 4)

select * from #ac_OrderItems

;with
orders(id, sku, price, couponId, rn)
as
(
select *, ROW_NUMBER() over(partition by id order by id) from #ac_OrderItems
)select iif(rn = 1,id,''),sku,price,couponId from orders
-- if i used int, empty is denoted by 0. But you want '' this. So i used varchar id

让你知道我,你得到了什么。