SQL Server根据特定行号获取列
我有一个要求,我需要选择过去一年的订单基于电子邮件帐单地址电子邮件地址。我需要显示订单号、发货名、发货姓氏、账单地址、电子邮件id和项目说明以及提交日期。相同的地址表用于将发货地址存储为1,并将账单地址发货地址存储为始终为0。shipping address中的电子邮件字段是可选的,如果两个地址都匹配,则只将帐单地址写入DB 地址: 我写了一个初始查询,如下所示:SQL Server根据特定行号获取列,sql,sql-server,Sql,Sql Server,我有一个要求,我需要选择过去一年的订单基于电子邮件帐单地址电子邮件地址。我需要显示订单号、发货名、发货姓氏、账单地址、电子邮件id和项目说明以及提交日期。相同的地址表用于将发货地址存储为1,并将账单地址发货地址存储为始终为0。shipping address中的电子邮件字段是可选的,如果两个地址都匹配,则只将帐单地址写入DB 地址: 我写了一个初始查询,如下所示: select addr.first_name, addr.last_name, addr.order_num, addr.
select
addr.first_name, addr.last_name, addr.order_num, addr.Update_Date_Time,
ord.Order_Amt, item.Item_Desc
from
ADDR addr
inner join
ORDER ord on ord.Order_num = addr.Order_Num
inner join
ITEM item on ord.Order_num = item.Order_Num
where
addr.Order_Num in (select Order_num
from TOEADDR addr
where addr.ShipTo_Num = 0
and addr.EM_EMAIL_ADDR = 'avc@abc.com'
and addr.Update_Date_Time > DATEADD(year,-1, GETDATE()))
order by
addr.Update_Date_Time desc
是否有任何方法可以将此逻辑添加到上述查询中:
(SELECT TOP 1 First_Name, LAST_NAME FROM ADDR ORDER BY ShipTo_Num ASC)
谢谢,有了CTE,它就像一个符咒。以下是最终查询:
;with cte_addr
AS
(SELECT First_Name,LAST_NAME, EM_EMAIL_ADDR, order_num,Update_Date_Time,ShipTo_Num
, ROW_NUMBER() OVER (PARTITION BY order_num ORDER BY ShipTo_Num desc) as ROWID
FROM ADDR
)
SELECT addr.first_name , addr.last_name, addr.order_num, addr.Update_Date_Time,
ord.Order_Amt, item.Item_Desc
FROM cte_addr addr
inner join ORDER ord on ord.Order_num = addr.Order_Num
inner join ITEM item on ord.Order_num = item.Order_Num
WHERE addr.ROWID =1 and
addr.Order_Num in(
select Order_num from ADDR billAddress where
billAddress.ShipTo_Num = 0 and billAddress.EM_EMAIL_ADDR = 'afv@abv.com'
and billAddress.Update_Date_Time > DATEADD(year,-1,GETDATE())
)
order by addr.Update_Date_Time desc
您可以使用CTE来实现它。您可以像下面这样编写查询。这可以是您正在寻找的逻辑的示例查询
;with cte_addr
AS
(SELECT First_Name,LAST_NAME, email EM_EMAIL_ADDR, order_num,Update_Date_Time,ShipTo_Num
, ROW_NUMBER() OVER (PARTITION BY First_Name,LAST_NAME ORDER BY ShipTo_Num) ROWID
FROM ADDR
)
SELECT addr.first_name , addr.last_name, addr.order_num, addr.Update_Date_Time,
ord.Order_Amt, item.Item_Desc
FROM cte_addr addr
inner join ORDER ord on ord.Order_num = addr.Order_Num
inner join ITEM item on ord.Order_num = item.Order_Num
WHERE t.ROWID =1
and addr.Order_Num in(
select Order_num from TOEADDR addr where
addr.ShipTo_Num = 0 and addr.EM_EMAIL_ADDR = 'avc@avc.com'
and addr.Update_Date_Time > DATEADD(year,-1,GETDATE())
)
order by addr.Update_Date_Time desc
您能提供一些示例数据和预期结果吗?这真的有助于您尝试编写子查询和连接以实现预期结果吗?
;with cte_addr
AS
(SELECT First_Name,LAST_NAME, email EM_EMAIL_ADDR, order_num,Update_Date_Time,ShipTo_Num
, ROW_NUMBER() OVER (PARTITION BY First_Name,LAST_NAME ORDER BY ShipTo_Num) ROWID
FROM ADDR
)
SELECT addr.first_name , addr.last_name, addr.order_num, addr.Update_Date_Time,
ord.Order_Amt, item.Item_Desc
FROM cte_addr addr
inner join ORDER ord on ord.Order_num = addr.Order_Num
inner join ITEM item on ord.Order_num = item.Order_Num
WHERE t.ROWID =1
and addr.Order_Num in(
select Order_num from TOEADDR addr where
addr.ShipTo_Num = 0 and addr.EM_EMAIL_ADDR = 'avc@avc.com'
and addr.Update_Date_Time > DATEADD(year,-1,GETDATE())
)
order by addr.Update_Date_Time desc