SQL:按父字段进行子查询过滤
SQL: Subquery filter by parent field
我有以下 SQL 查询,我无法开始工作。
数据架构
| Timestamp | Status | Amount |
|--------------------------|----------|--------|
| 2016-03-23T08:03:34.204Z | Approved | 100 |
| 2016-03-23T16:00:06.755Z | Declined | 450 |
| 2016-03-30T10:18:43.846Z | Approved | 50010 |
期望的输出
| Date | Approved Count | Declined Count |
|------------|----------------|----------------|
| 2016-03-23 | 1 | 1 |
| 2016-03-30 | 1 | 0 |
我试过的
SELECT DATE(timestamp) AS Date,
(SELECT COUNT(*)
FROM db.transactions
WHERE status='Approved'
AND DATE(timestamp)=Date) AS Approved,
(SELECT COUNT(*)
FROM db.transactions
WHERE status='Declined') AS Declined
FROM db.transactions a
GROUP BY Date;
.. 失败并显示错误消息:
An error occurred with Amazon Redshift. column "date" does not exist
SELECT DATE(timestamp),
(SELECT COUNT(*)
FROM db.transactions
WHERE status='Approved'
AND DATE(timestamp) AS Approved,
(SELECT COUNT(*)
FROM db.transactions
WHERE status='Declined') AS Declined
FROM db.transactions GROUP BY Date;
您收到的错误是由于尝试在 GROUP BY
子句中使用 SELECT
子句中定义的列别名,该别名不可用,因为 GROUP BY
实际上是在 SELECT
之前处理。您可以使用 GROUP BY DATE(timestamp)
来消除错误,但是使用条件聚合可以更有效地完成此操作:
SELECT DATE(timestamp) AS Date
,SUM(CASE WHEN status='Approved' THEN 1 ELSE 0 END) AS Approved
,SUM(CASE WHEN status='Declined' THEN 1 ELSE 0 END) AS Declined
FROM db.transactions
GROUP BY DATE(timestamp)
我有以下 SQL 查询,我无法开始工作。
数据架构
| Timestamp | Status | Amount |
|--------------------------|----------|--------|
| 2016-03-23T08:03:34.204Z | Approved | 100 |
| 2016-03-23T16:00:06.755Z | Declined | 450 |
| 2016-03-30T10:18:43.846Z | Approved | 50010 |
期望的输出
| Date | Approved Count | Declined Count |
|------------|----------------|----------------|
| 2016-03-23 | 1 | 1 |
| 2016-03-30 | 1 | 0 |
我试过的
SELECT DATE(timestamp) AS Date,
(SELECT COUNT(*)
FROM db.transactions
WHERE status='Approved'
AND DATE(timestamp)=Date) AS Approved,
(SELECT COUNT(*)
FROM db.transactions
WHERE status='Declined') AS Declined
FROM db.transactions a
GROUP BY Date;
.. 失败并显示错误消息:
An error occurred with Amazon Redshift. column "date" does not exist
SELECT DATE(timestamp),
(SELECT COUNT(*)
FROM db.transactions
WHERE status='Approved'
AND DATE(timestamp) AS Approved,
(SELECT COUNT(*)
FROM db.transactions
WHERE status='Declined') AS Declined
FROM db.transactions GROUP BY Date;
您收到的错误是由于尝试在 GROUP BY
子句中使用 SELECT
子句中定义的列别名,该别名不可用,因为 GROUP BY
实际上是在 SELECT
之前处理。您可以使用 GROUP BY DATE(timestamp)
来消除错误,但是使用条件聚合可以更有效地完成此操作:
SELECT DATE(timestamp) AS Date
,SUM(CASE WHEN status='Approved' THEN 1 ELSE 0 END) AS Approved
,SUM(CASE WHEN status='Declined' THEN 1 ELSE 0 END) AS Declined
FROM db.transactions
GROUP BY DATE(timestamp)