Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 自连接问题,语法不正确_Sql_Sql Server_Join_Self Join - Fatal编程技术网

Sql 自连接问题,语法不正确

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年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 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