Как очистить другие строки с одинаковыми деталями столбцов - PullRequest
0 голосов
/ 30 апреля 2018

Привет ниже мой 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    

Я хочу, чтобы, если номер заказа был таким же, в этом случае все подробные записи должны располагаться в 1-й строке, а затем после другой записи должны показываться только Sku и только цена, а также нам нужно удалить столбец DENSE_RANK ()

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Видя, что запрос выглядит как Partition Предложение может помочь вам решить проблему. Пожалуйста, посмотрите на запрос ниже. Я не уверен о модели данных, но похоже, что вам нужно разделить с помощью столбец OrderNumber. Пожалуйста, замените запрос в первом CTE на вашу фактическую таблицу, которая будет похожа на второй запрос. Я не могу проверить это, так как у меня нет среды. Пожалуйста, проверьте запрос

;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
0 голосов
/ 01 мая 2018

Извините ....! Я не могу понять ваши объяснения .. Я просто работал только для получения ожидаемого ОП ...

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

дай мне знать, что у тебя есть.

0 голосов
/ 30 апреля 2018

При просмотре вашего комментария это попытка решить его по самому запросу (я предположил, что 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;
...