【问题标题】:SQL query error not workingSQL查询错误不起作用
【发布时间】:2016-04-14 11:36:23
【问题描述】:

我已经编写了一个 SQL 查询,但是我收到了错误

“公司名称”附近的语法不正确。

我使用的是 SQL Server 2005。

我的查询:

SELECT TOP 1 
    MONTH(a.dt_of_leave) MONTH,
    YEAR(a.dt_of_leave) YEAR 
FROM 
    emp_mst a 
WHERE 
    MONTH(a.dt_of_leave) >= MONTH(getdate()) - 1
    AND YEAR(a.dt_of_leave) = CASE 
                                 WHEN MONTH(getdate()) = 1  
                                 THEN YEAR(getdate()) - 1 
                                 ELSE YEAR(getdate()) company_name 'COMPANY NAME',
    Deputed_Company_Name 'DEPUTED COMPANY NAME' emp_card_no 'EMP CODE',
    emp_name 'EMPLOYEE NAME',
    LWP,
   '' Remarks,
   Adj_Days Gain_Loss_LOP_Days,
   VAL_DAY LOP_Days_Desc,
   MONTH,
   YEAR
 FROM XXACL_EMP_INFO_LWP_OTDAYS_HRS_V WHERE emp_type='C'
  AND MONTH = '3'
 AND YEAR = '2016'
 AND emp_card_no IN(312,
                 1250,
                 362)

更新

我有两个工作查询:

第一次查询

select top 1 
    month(a.dt_of_leave) month,  
    year(a.dt_of_leave) year
from 
    emp_mst a 
where 
    month(a.dt_of_leave) >= month(getdate())-1  
    and year(a.dt_of_leave) = case 
                                 when month(getdate()) = 1 
                                    then year(getdate()) - 1 
                                    else year(getdate()) 
                              end
    and emp_card_no IN (312, 1250, 362)
order by 
    emp_name 

第二次查询:

select 
    company_name 'COMPANY NAME',
    Deputed_Company_Name 'DEPUTED COMPANY NAME', 
    emp_card_no 'EMP CODE',
    emp_name 'EMPLOYEE NAME',
    LWP, '' Remarks, 
    Adj_Days Gain_Loss_LOP_Days, 
    VAL_DAY LOP_Days_Desc, month, year 
from 
    XXACL_EMP_INFO_LWP_OTDAYS_HRS_V 
where 
    emp_type = 'C' 
    and month = '3' and year = '2015' 
    and emp_card_no in (312, 1250, 362)

我想要的是在第二个查询中,我想添加从第一个查询中获得的月份和年份..

我需要在第二个查询中合并它

【问题讨论】:

  • 我将首先格式化查询,以便可以阅读。
  • @GordonLinoff:我尝试对其进行格式化,但无法做到。请帮忙。
  • 查询 - 按原样 - 只是没有任何意义 - 你在 WHERE 子句中有一个 CASE 表达式,它包含一个完整的列列表或其他东西 - 这只是看不懂……
  • @marc_s:我必须结合查询来获取monthyear,让我再次更新问题以明确
  • 你能用简单的英语解释你想在这里做什么吗?你不能有一个带有CASE 表达式的WHERE 子句,然后是带有另一个FROM 子句的整个列列表......

标签: sql sql-server-2005


【解决方案1】:

尝试这样的事情 - 它将使用外部 WHERE 子句中给出的三个 emp_card_no,并获取它们最近的月份/年份条目:

; WITH MonthAndYear AS 
(
    SELECT 
        MONTH(a.dt_of_leave) month, 
        YEAR(a.dt_of_leave) year,
        emp_card_no,
        RowNum = ROW_NUMBER() OVER (PARTITION BY emp_card_no ORDER BY dt_of_leave DESC)
    FROM
        emp_mst a
    WHERE
        MONTH(a.dt_of_leave) >= MONTH(GETDATE()) - 1
        AND YEAR(a.dt_of_leave) = CASE 
                                     WHEN MONTH(GETDATE()) = 1 
                                        THEN YEAR(GETDATE()) - 1
                                        ELSE YEAR(GETDATE())
                                     END
)
SELECT
    x.company_name 'COMPANY NAME', 
    x.Deputed_Company_Name 'DEPUTED COMPANY NAME', 
    x.emp_card_no 'EMP CODE', 
    x.emp_name 'EMPLOYEE NAME', 
    x.LWP, '' Remarks,
    x.Adj_Days Gain_Loss_LOP_Days, 
    x.VAL_DAY LOP_Days_Desc, 
    x.month, x.year
FROM
    XXACL_EMP_INFO_LWP_OTDAYS_HRS_V x
INNER JOIN 
    MonthAndYear my ON x.emp_card_no = my.emp_card_no 
                    AND x.Month = my.Month AND x.Year = my.Year
                    AND my.RowNum = 1
WHERE
    x.emp_type = 'C'
    AND x.emp_card_no IN (312, 1250, 362);

我希望这就是您想要的!如果没有 - 请分享表结构、示例数据、预期输出等。

【讨论】:

  • 试过了,得到Msg 209, Level 16, State 1, Line 33 Ambiguous column name 'emp_card_no'. Msg 209, Level 16, State 1, Line 33 Ambiguous column name 'emp_card_no'.的错误
  • @coder: 月份和年份被通过 - 从哪里到哪里?!??!??!
  • @coder: 所以你想将AND x.month = my.month AND x.year = my.year 添加到JOIN 条件,也许??
  • 使用了你的答案,但结果中没有记录,因为月份 = 3 和年份 = 2015 应该有一个结果
猜你喜欢
  • 1970-01-01
  • 2016-09-14
  • 2015-07-26
  • 2022-08-06
  • 1970-01-01
  • 2013-11-15
  • 2011-04-13
  • 2013-02-03
  • 1970-01-01
相关资源
最近更新 更多