需要基本的SQL查询帮助

时间:2012-04-05 10:09:52

标签: sql sql-server

我有一张包含3个柱子的桌子。 以下是一个示例,只有几个条目可供演示。该表格表示商品价格变化的日期。我需要一个查询,告诉我特定日期所有项目的价格。具体日期可能介于价格变动之间。价格在午夜变化,因此变化的日期,即从那时起直到前一次变更前一天的价格

itemCode  datePriceEffective  price  
AB         2012-01-01          9.99  
AB         2012-03-02          10.50  
XY         2011-09-20          34.99  

我希望获得给定日期的所有商品价格。每个日期都没有条目,只有价格变化的日期。 所以2012-03-05将会回归

AB 10.50
XY 34.99

和2012-02-27将返回:

AB 9.99  
XY 34.99

获取此问题所需的SQL查询逃脱了我。答案赞赏。

编辑的答案是错误的方向,请参阅斜体编辑。

7 个答案:

答案 0 :(得分:3)

这将按照itemCode的datePriceEffective降序检索第一条记录。

select top 1 with ties *
from ATable
where datePriceEffective <= @givenDate
order by row_number() over (partition by itemCode 
                            order by datePriceEffective desc)

答案 1 :(得分:2)

SELECT itemCode,price FRom TableNameHere WHERE datePriceEffective <= '2012-03-05'

更多信息后编辑 - 一个“简单”的答案,希望能让您轻松跟进。

您将获得在您所需的日期范围内有效的商品的最新日期,然后将该表连接到自身以获取该日期的价格

SELECT t1.itemCode,t1.price FROM 
  (
  SELECT itemCode,MAX(datePriceEffective) AS datePriceEffective
  FROM TableNameHere
  WHERE datePriceEffective <= '2012-03-05'
  ) a
INNER JOIN TableNameHere t1 ON t1.itemCode = a.itemCode AND t1.datePriceEffective = a.datePriceEffective

答案 2 :(得分:1)

您需要按如下方式重新加入表格:

declare @effdate datetime
set @effdate = CONVERT(datetime,'2012-02-27')

;WITH CTE_DATA as (
    select itemCode='AB',  datePriceEffective = CONVERT(Datetime,'2012-01-01'),  price = 9.99
    union all select itemCode='AB',  datePriceEffective = CONVERT(Datetime,'2012-03-02'),  price = 10.50
    union all select itemCode='XY',  datePriceEffective = CONVERT(Datetime,'2011-09-20'),  price = 34.99
)
select
    d.itemcode,
    price
from
    CTE_DATA d
    join (
        select  
            itemcode,
            effdate = MAX(datepriceeffective)
        from CTE_DATA sub where sub.datepriceeffective <= @effdate
        group by itemcode
    ) x
        on x.itemCode = d.itemCode
        and x.effdate = d.datePriceEffective

请注意,CTE仅适用于此示例,您应将其交换为真实表。

更新:另一种方法是使用ROW_NUMBER和PARTITION,如下所示:

SELECT        
    itemcode,
    price
FROM     
   (
        SELECT   
            itemcode,
            price,
            rowno = ROW_NUMBER() over (partition by itemcode order by datePriceEffective desc)
        from
            CTE_DATA
            where datePriceEffective <= @effdate
    ) x
where 
    rowno = 1

(将此选择替换为上一个查询中的选择以对数据进行尝试)

答案 3 :(得分:1)

declare @date datetime = '2012-03-05'

select distinct itemcode,
    (
        select top(1) itemprice 
        from mytable mt2 
        where 
            mt1.itemcode = mt2.itemcode and
            mt2.datepriceeffective <= @date
        order by datepriceeffective desc
    ) as itemprice
from 
    mytable mt1
where
    datepriceeffective <= @date

答案 4 :(得分:1)

SELECT b.itemCode, 
(SELECT Price FROM dbo.tblProducts a WHERE datePriceEffective = 
(SELECT MAX(a.datePriceEffective) FROM dbo.tblProducts a WHERE a.itemCode = b.itemCode)) AS Price
FROM dbo.tblProducts b
WHERE b.datePriceEffective <= '2012-03-05'
GROUP BY b.itemCode

我测试了它!它会为您提供每个项目的最新价格

答案 5 :(得分:0)

假设您有另一个名为'GivenDate'的列,则下面是查询。

SELECT itemCode, price
FROM tblName
WHERE GivenDate= '2012-03-05'

答案 6 :(得分:0)

这适用于sql2000

SELECT      s.itemCode
            , ( SELECT      TOP 1 price
                FROM        #MyTable
                WHERE       itemCode = s.itemCode
                            AND datePriceEffective < @SearchDate ) AS price
FROM        (
            SELECT DISTINCT itemCode 
            FROM   #MyTable
            ) s