0

任务:显示三月份在浦那和加尔各答地点发生的客户姓名及其订单

顾客:

CUST_ID    CUST_NAME    LOCATION
---------------------------------
   1          A         HYD
   2          B         PUNE
   3          C         DELHI
   4          D         KOLKATA

订单:

ORDER_ID    CUST_ID AMOUNT  DATE
----------------------------------
100 3   1000    2019-03-22
101 2   2000    2019-03-12
103 1   3000    2019-04-11
104 2   5000    2019-04-10
105 3   6000    2019-02-18

询问:

SELECT
    c.cust_name, c.location,
    CONVERT(VARCHAR(3), Date1, 100) AS Month
FROM
    customers1 c 
FULL OUTER JOIN
    orders o ON o.cust_id = c.cust_id
WHERE
    c.LOCATION = 'PUNE' OR c.LOCATION = 'KOLKATA'
GROUP BY 
    date1
HAVING
    Month = 'Mar'

我收到此错误:

消息 207,级别 16,状态 1,第 7 行
无效的列名称“月”

4

2 回答 2

3

不能在 HAVING 子句中引用别名。出于性能原因,我建议过滤月份编号,而不是月份缩写。

SELECT
     c.cust_name
    ,c.location
    ,CONVERT(varchar(3), Date1, 100) as Month
FROM customers1 c
    INNER JOIN orders o on o.cust_id=c.cust_id
WHERE
    (c.LOCATION='PUNE' or c.LOCATION='KOLKATA')
WHERE
    MONTH(Date1) = 3
于 2019-04-11T19:10:26.163 回答
2

您尝试做的事情在 SQL Server 中不起作用,您不能在or子句中使用SELECT别名(您这样做的方式)。WHEREHAVING

此外,不需要外连接。您可以使用以下方式表达您想要的内容apply

select c.cust_name, c.location, v.month
from customers1 c join
     orders o
     on o.cust_id = c.cust_id cross apply
     (values (CONVERT(varchar(3), Date1, 100))) v(Month)
where c.LOCATION in ('PUNE', 'KOLKATA') and
      v.month = 'Mar';

我不知道你为什么有group by date1date1不在select列表中,并且您没有聚合函数,因此聚合似乎没有必要。

当然,我会将其简化为:

select c.cust_name, c.location, 
       left(datename(month, date1))
from customers1 c join
     orders o
     on o.cust_id = c.cust_idv(Month)
where c.LOCATION in ('PUNE', 'KOLKATA') and
      month(date1) = 3;
于 2019-04-11T18:59:46.447 回答