自我加入问题-定义提取的时间段

问题描述 投票:0回答:1

在下面的查询中,我在“选择”查询中提取月份。然后,我使用提取的月份执行多个自我联接。月提取不适用于自我联接表。我将在下面的查询中在哪里定义提取的月份?

SELECT   MONTH(frcst.InvDate) AS mnth
       , frcst.LineCode
       , frcst.ClassCode
       , cc_type
       , rank
       , keycust1
       , keycust2
       , keycust3
       , sales1
       , sales2
       , sales3
       , SUM(ship2017.GrossSales) AS gross_sales2017
       , SUM(ship2017.QtyShip + ( (ship2017.QtyOrd - ship2017.QtyShip) * 0.25) ) AS frcst_qty2017
       , SUM(ship2018.GrossSales) AS gross_sales2018
       , SUM(ship2018.QtyShip + ( (ship2018.QtyOrd - ship2018.QtyShip) * 0.25) ) AS frcst_qty2018
       , SUM(ship2019.GrossSales) AS gross_sales2019
       , SUM(ship2019.QtyShip + ( (ship2019.QtyOrd - ship2019.QtyShip) * 0.25) ) AS frcst_qty2019
       , SUM(ship2020.GrossSales) AS gross_sales2020
       , SUM(ship2020.QtyShip + ( (ship2020.QtyOrd - ship2017.QtyShip) * 0.25) ) AS frcst_qty2020
  FROM FrcstFactTbl frcst
  JOIN account_hierarchy_lu account
    ON frcst.AccountNumber = account.account_number
  JOIN cc_type_lu cct
    ON frcst.ClassCode = cct.class_code
  JOIN pop_code_lu pop
    ON frcst.PartNumber = pop.PartNumber
  JOIN FrcstFactTbl ship2017
    ON frcst.mnth = ship2017.mnth
   AND frcst.LineCode = ship2017.LineCode
   AND frcst.ClassCode = ship2017.ClassCode
   AND frcst.AccountNumber = ship2017.AccountNumber
  JOIN FrcstFactTbl ship2018
    ON frcst.mnth = ship2018.mnth
   AND frcst.LineCode = ship2018.LineCode
   AND frcst.ClassCode = ship2018.ClassCode
   AND frcst.AccountNumber = ship2018.AccountNumber
  JOIN FrcstFactTbl ship2019
    ON frcst.mnth = ship2019.mnth
   AND frcst.LineCode = ship2019.LineCode
   AND frcst.ClassCode = ship2019.ClassCode
   AND frcst.AccountNumber = ship2019.AccountNumber
  JOIN FrcstFactTbl ship2020
    ON frcst.mnth = ship2020.mnth
   AND frcst.LineCode = ship2020.LineCode
   AND frcst.ClassCode = ship2020.ClassCode
   AND frcst.AccountNumber = ship2019.AccountNumber
 WHERE YEAR(ship2017.InvDate) = '2017'
   AND YEAR(ship2018.InvDate) = '2018'
   AND YEAR(ship2019.InvDate) = '2019'
   AND YEAR(ship2020.InvDate) = '2020'
GROUP BY mnth, frcst.LineCode, frcst.ClassCode, cc_type, rank, keycust1, keycust2, keycust3, sales1, sales2, sales3
ORDER BY mnth 

sql sql-server self-join
1个回答
0
投票

唯一可以使用列别名的位置(这是mnth)在order by子句中。在其他任何地方,您都必须使用计算MONTH(frcst.InvDate)或在子查询中对其进行计算。

我将使用子查询,即替换此行:

FROM FrcstFactTbl frcst

使用此:

FROM (
  select *, MONTH(frcst.InvDate) AS mnth
  from FrcstFactTbl
) frcst
© www.soinside.com 2019 - 2024. All rights reserved.