微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL-过滤器的多个子句

如何解决SQL-过滤器的多个子句

所以我不完全确定它应该是 WHERE 语句还是子条款,还是 CASE。坦白说,我还在努力学习 subclause 和 CASE 的用例。

最后我想要的是他们的出席人数和他们在特定时间范围内支付的发票总额。

我在尝试“错误:语法错误位于或接近“来自”位置:349 时出现错误

预期输出:儿童姓名、中心 ID、教室名称、出勤人数、发票总和、日期、

我要加入多个表,并希望过滤特定日期内的出勤率和特定日期内支付的发票:

select accounts.fname as first_name,accounts.lname as last_name,accounts.dob,centers.label,classrooms.label as classroom_label,count(*) as no_of_days_attended,sum(transactions.amount / 100.0) as sum_of_transactions_paid,from daily_reports
join account_classrooms
on daily_reports.account_classroom_id = account_classrooms.id
join accounts
on account_classrooms.account_id = accounts.id
join classrooms
on account_classrooms.classroom_id = classrooms.id
join centers
on classrooms.center_id = centers.id
join invoices
on centers.id = invoices.center_id
join transactions
on transactions.invoice_id = invoices.id
where daily_reports.ref_date and transactions.created_at > {{start_date}} and daily_reports.ref_date and transactions.created_at < {{end_date}} and centers.id = {{center_id}}
group by daily_reports.account_classroom_id,accounts.id,classrooms.id,centers.id,

非常感谢!

解决方法

您遇到了一些问题。

首先,在您的 FROM 子句之前有一个额外的逗号,另一个在 GROUP BY 的末尾。您的 GROUP BY 列不会出现在您的 SELECT 语句中,因此这是行不通的。在进行聚合(SUM()、MAX() 等)时,引擎必须知道按哪些列对聚合进行分组。这些是您的 SELECT 列表中的列。

其次,您不能像这样同时计算两列:

daily_reports.ref_date and transactions.created_at > {{start_date}}

如果你这样做了,你会得到这个错误:

An expression of non-boolean type specified in a context where a condition is expected,near 'AND'.

每个评估都必须是原子的。在这个例子中,它必须是这样的:

daily_reports.ref_date > {{start_date}} and transactions.created_at > {{start_date}}

但是,可以使用 BETWEEN 运算符进一步清理 WHERE 子句。此外,最好不要使用隐式 JOIN。在您的代码中定义 JOIN 的类型(例如 INNER JOIN)。

我已应用别名、格式化代码并应用 BETWEEN 运算符。看看这是否适合你。如您所见,当代码格式正确时,它更具可读性,也更容易发现问题。

SELECT  a.fname AS first_name,a.lname AS last_name,a.dob,cn.label,cl.label AS classroom_label,COUNT(*) AS no_of_days_attended,SUM(t.amount / 100.0) AS sum_of_transactions_paid
FROM    daily_reports AS dr
        INNER JOIN account_classrooms AS ac ON dr.account_classroom_id = ac.id
        INNER JOIN accounts AS a ON ac.account_id = a.id
        INNER JOIN classrooms AS cl ON ac.classroom_id = cl.id
        INNER JOIN centers AS cn ON cl.center_id = cn.id
        INNER JOIN invoices AS i ON cn.id = i.center_id
        INNER JOIN transactions AS t ON t.invoice_id = i.invoices.id
WHERE   dr.ref_date BETWEEN @start_date AND @end_date
        AND t.created_at BETWEEN @start_date AND @end_date
        AND cn.id = @center_id
GROUP BY
        a.fname,a.lname,cn.label

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。