【问题标题】:Level 15, State 1, Line 136 An expression of non-boolean type specified in a context where a condition is expected, near ')'第 15 级,状态 1,第 136 行 在预期条件的上下文中指定的非布尔类型表达式,靠近 ')'
【发布时间】:2019-12-26 12:45:20
【问题描述】:
SELECT 
    c.customer_Id, SUM(total_amt), DATEDIFF(YEAR, DOB, GETDATE()) as DOB
FROM 
    Transactions T
INNER JOIN 
    Customer C ON T.cust_id = C.customer_Id
GROUP BY
    c.customer_Id, DATEDIFF(YEAR, DOB, GETDATE())
HAVING
    (DATEDIFF(YEAR, DOB, GETDATE()) BETWEEN 25 AND 35)
    AND (SELECT tran_date
         FROM Transactions
         HAVING tran_date BETWEEN DATEADD (DAY , -30, MAX(tran_date)) AND MAX(tran_date))

执行上述代码时出现此错误:

消息 4145,第 15 级,状态 1,第 136 行
在预期条件的上下文中指定的非布尔类型表达式,靠近 ')'

【问题讨论】:

  • 请解释您要做什么。样本数据和期望的结果会有所帮助。非工作查询不需要传达此信息。
  • SELECT tran_date ... 子查询返回一些数据集,而不是布尔值。也许EXISTS 操作员丢失了?但它是不相关的,通常“总是正确的”,并且它使用明确的 GROUP BY。\

标签: sql sql-server


【解决方案1】:

如果您想要汇总每个客户最近 30 天的交易,其中客户的年龄在 25 到 35 岁之间,那么您基本上要在 聚合之前进行过滤:

SELECT c.customer_Id, SUM(total_amt), DATEDIFF(YEAR, DOB, GETDATE()) as DOB
FROM Customer C JOIN
     (SELECT T.*,
             MAX(tran_date) OVER (PARTITION BY cust_id) as max_tran_date
      FROM Transactions T
     ) T
     ON T.cust_id = C.customer_Id
WHERE DOB >= DATEADD(YEAR, -35, GETDATE()) AND
      DOB < DATEADD(YEAR, -24, GETDATE()) AND
      t.tran_date >= DATEADD(DAY, -30, max_tran_date)
GROUP BY c.customer_Id, DATEDIFF(YEAR, DOB, GETDATE());

【讨论】:

  • 我实际上试图找到“对于年龄在 25 到 35 岁之间的所有客户,从数据中可用的最大交易日期算起,这些消费者在过去 30 天的交易中产生的净总收入是多少? "
  • @Priyanshu 。 . .这就是这个查询的作用。
  • @Priyanshu 你能留下你的数据样本吗?可能是输入数据导致了问题,没有任何数据样本就很难识别。
  • @Atmira 请提供示例数据
  • @GordonLinoff 请提供样本数据
猜你喜欢
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多