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

Sql server 2008 如何清空具有相同列详细信息的其他行,sql-server-2008,sql-server-2012,sql-server-2008-r2,dense-rank,Sql Server 2008,Sql Server 2012,Sql Server 2008 R2,Dense Rank,下面是我的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 Jo

下面是我的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和价格,我们还需要删除稠密的列

看到您的评论,这是试图解决查询本身的问题(如果OrderNumber是唯一的,我假设CouponRowID可以执行此任务):

通过查看类似于
分区的查询
子句可以帮助您 解决问题。请查看下面的查询。我不太确定 关于数据模型,但看起来需要使用
OrderNumber
列。请将第一个
CTE
中的查询替换为与第二个查询类似的实际表。我无法测试它,因为我没有环境。请测试查询


对不起……我听不懂你的解释。。 我只是为了得到你期望的机会

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

让你知道你得到了什么。

这是你应该在UI中解决的问题。如果你使用C#或任何其他.Net语言,你可以使用Linq和group by。这将显示为你想要的样子。@CetinBasoz我只需要在查询中使用它,然后你可以添加行数,并使用该值来填充行数值大于1的空白行。我看不到我ts有用性。您将在何处使用该结果?如果OrderNumber是唯一的,则可以使用CouponRowID。@CetinBasoz我有一个控制台应用程序,用于使用从sql获取的此类数据生成excel,目前我只有该应用程序的.exe文件,因此我需要在query End上修复此问题。顺便说一句,您可以使用excel“pivot”因此,您不需要在查询时求解它(甚至可以为您计算sum()。
;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
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