Sql 自连接问题,语法不正确
我有一个数据库,包含2017年1月至今每月的发货量。我希望将每年的发货数量按年放在唯一的列中(用于操纵PowerBI可视化) 第一个查询(不含年度列)工作: 我在查询中遇到一个错误(包含年度列): 味精102,第15级,状态1,第12行Sql 自连接问题,语法不正确,sql,sql-server,join,self-join,Sql,Sql Server,Join,Self Join,我有一个数据库,包含2017年1月至今每月的发货量。我希望将每年的发货数量按年放在唯一的列中(用于操纵PowerBI可视化) 第一个查询(不含年度列)工作: 我在查询中遇到一个错误(包含年度列): 味精102,第15级,状态1,第12行 “2017”附近的语法不正确 任何建议都将不胜感激。第一选择: 将2017gross\u sales、2018gross\u sales和2019gross\u sales分别替换为gross\u sales\u 2017、gross\u sales\u 201
“2017”附近的语法不正确
任何建议都将不胜感激。第一选择: 将
2017gross\u sales
、2018gross\u sales
和2019gross\u sales
分别替换为gross\u sales\u 2017
、gross\u sales\u 2018
和gross\u sales\u 2019
最好的做法是以字母字符开头列名
第二选项:
根据@DaleK评论,您可以使用方括号,如[2017gross\u sales]
第三个选项:
您可以使用双引号
“
如“2017gross_sales”
,或者在其周围放上方括号,例如[2020_frcst_qty]`,或者以字母开头。这很有效,但现在我有另一个问题。每次在自联接中引用该字段时,我都会得到一个“无效的列名'mnth'。我在SELECT语句中定义了初始表的月份。在哪里可以为自联接中使用的表定义月份?可以使用列别名的唯一位置(即mnth
是什么)是在orderby
子句中。在其他任何地方,你都必须使用计算月(frcst.InvDate)
或在子查询中计算它。顺便说一句-你真的应该问一个新问题,因为你问的问题已经得到了回答,而不是一个SO问题对你来说是一个完整的调试会话。很好,你问了一个新问题,另外,请接受以下关于这个问题的答案。如果您引用(和参考)规范中关于什么是允许的,什么是不允许的,则更准确。例如下划线(\u
)完全可以,而不是字母。@satdaya如果答案是问题的解决方案,请单击勾号接受它。谢谢
SELECT
FORMAT(frcst.InvDate, 'yyyyMM') AS period_name
, MONTH(frcst.InvDate) AS month_num
, YEAR(frcst.InvDate) AS year_num
, frcst.LineCode
, frcst.ClassCode
, cc_type
, rank
, keycust1
, keycust2
, keycust3
, sales1
, sales2
, sales3
, SUM(GrossSales) AS gross_sales
, SUM (QtyShip + ( (QtyOrd - QtyShip) * 0.25) ) AS frcst_qty
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
GROUP BY
InvDate, frcst.LineCode, frcst.ClassCode, cc_type, rank,
keycust1, keycust2, keycust3, sales1, sales2, sales3
ORDER BY
InvDate
SELECT
MONTH(frcst.InvDate) AS mnth
, frcst.LineCode
, frcst.ClassCode
, cc_type
, rank
, keycust1
, keycust2
, keycust3
, sales1
, sales2
, sales3
, SUM(ship2017.GrossSales) AS 2017gross_sales
, SUM(ship2017.QtyShip + ((ship2017.QtyOrd - ship2017.QtyShip) * 0.25)) AS 2017_frcst_qty
, SUM(ship2018.GrossSales) AS 2018gross_sales
, SUM(ship2018.QtyShip + ((ship2018.QtyOrd - ship2018.QtyShip) * 0.25)) AS 2018_frcst_qty
, SUM(ship2019.GrossSales) AS 2019_gross_sales
, SUM(ship2019.QtyShip + ((ship2019.QtyOrd - ship2019.QtyShip) * 0.25)) AS 2019_frcst_qty
, SUM(ship2020.GrossSales) AS ship2020_gross_sales
, SUM(ship2020.QtyShip + ((ship2020.QtyOrd - ship2017.QtyShip) * 0.25)) AS 2020_frcst_qty
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.keycust3 = ship2017.keycust3
JOIN
FrcstFactTbl ship2018 ON frcst.mnth = ship2018.mnth
AND frcst.LineCode = ship2018.LineCode
AND frcst.ClassCode = ship2018.ClassCode
AND frcst.keycust3 = ship2018.keycust3
JOIN
FrcstFactTbl ship2019 ON frcst.mnth = ship2019.mnth
AND frcst.LineCode = ship2019.LineCode
AND frcst.ClassCode = ship2019.ClassCode
AND frcst.keycust3 = ship2019.keycust3
JOIN
FrcstFactTbl ship2020 ON frcst.mnth = ship2020.mnth
AND frcst.LineCode = ship2020.LineCode
AND frcst.ClassCode = ship2020.ClassCode
AND frcst.keycust3 = ship2020.keycust3
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