【问题标题】:Return latest price per product - SQL返回每个产品的最新价格 - SQL
【发布时间】:2018-09-18 22:21:59
【问题描述】:

我是一个 SQL 菜鸟,并且被深深地投入到它的感觉中,我被要求使用现有脚本从数据库中提取一些数据。我需要修改脚本,以便使用每种产品的最新价格提取产品信息。完成了一些reading 之后,我相信我需要使用嵌套选择语句来提取每个产品的最大月份以获得最新价格,但我不确定如何将其合并到我的脚本中。

目前数据库返回以下格式:

Fill Month  ProdName1   ProdName2   PackType    Quantity    Prod Cost
  2018/01   ProdA        ProdA_ALT  Pack1         30          7.35
  2018/02   ProdB        ProdB_ALT  Pack5         60          6.68
  2018/01   ProdE        ProdE_ALT  Pack2         54538      81010.86
  2018/03   ProdA        ProdA_ALT  Pack1         600         97.22
  2018/01   ProdC        ProdC_ALT  Pack2         1230       30192.25
  2018/05   ProdD        ProdD_ALT  Pack4         60262      51396.6
  2018/01   ProdF        ProdF_ALT  Pack3         480         109.3
  2018/07   ProdA        ProdA_ALT  Pack1         210         149.94
  2018/09   ProdF        ProdF_ALT  Pack3         360         26.68
  2018/10   ProdD        ProdD_ALT  Pack4         9585        14350.47

但我希望返回的是第 2、3、5、8、9、10 行,因为这些是每种产品基于日期的最新价格。

我的 SQL 查询如下所示:

SELECT               
        table1.month AS 'Fill Month',
        table2.field2 AS PackType,
        TRIM(table2.brand) ProdName1,
        TRIM(table2.field3) ProdName2,
        SUM(table3.field4) 'Fill Qty',
        SUM(table3.field5) 'Calc Cost'

FROM
        DB_Name.overseas.CLAIMINFO table3
        INNER JOIN DB_Name.overseas.DIM1 table1
        ON table3.key1 = table1.key1
        INNER JOIN DB_Name.overseas.DIM2 table2
        ON table3.key2 = table2.key2
        INNER JOIN DB_Name.overseas.DIM3 table4 
        ON table3.key3 = table4.key3
        INNER JOIN DB_Name.overseas.DIM4 table5
        ON table3.key4 = table5.key4
        INNER JOIN DB_Name.overseas.DIM5 table6
        ON table3.key5 = table6.key5 
        INNER JOIN DB_Name.overseas.LOOKUP table7
        ON table3.key6 = table7.key6
        INNER JOIN DB_Name.overseas.DIM6 table8
    ON table3.key7 = table8.key7
    INNER JOIN DB_Name.overseas.LOOKUP_key8 table9
        ON table3.key8 = table9.key8

WHERE
        table1.day BETWEEN '2018-01-01' AND '2018-08-31'  --TIME PERIOD
        AND (table2.brand LIKE '%PRODA%' OR table2.brand LIKE '%PRODUCTB%'
                                            OR table2.brand LIKE '%PRODC%'
                                            OR table2.brand LIKE '%PRODD%'
                                            OR table2.brand LIKE '%PRODE%'
                                            OR table2.brand LIKE '%PRODF%'
        AND LEFT(table3.account_id, 1) <> 'E' 
        AND grp1.grp_nbr NOT IN ('12345', '67890')

GROUP BY 
        table1.month,
        table2.field2,
        table2.field3,
        table2.drug_str_descr,
        dr1

我曾尝试在第一个 from 语句中使用嵌套 SELECT,但 RDBMS 每次都会返回一个错误,如果有人有任何指示,我将非常感激。

【问题讨论】:

  • 虽然我知道您(可能)试图通过混淆表名和列名来概括查询,但您也混淆了这个问题;例如,当table[4-9] 似乎没有任何目的时,为什么要将它们拉到查询中(或者您是否试图验证所述表中是否存在匹配的行?); grp1 是什么(最后一个 WHERE 子句中的红色)?为什么您的非聚合 select 列与 group by 列不匹配(即,您是否了解后果)?为什么要找sum() 当你没有提到任何关于需要总和的事情?

标签: sql sybase nested-select


【解决方案1】:

要获取每个产品更改的最后日期,请尝试以下操作:

(SELECT ProdName1, Max(FillMonth) 
FROM tablename
GROUP BY ProdName1) AS ProductDates

您可以在 FROM 子句中加入这一点,以将结果限制为您想要的月份。

【讨论】:

    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2016-04-25
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多