[英]How to write an oracle SQL query that involves multiple selects
我有這個查詢,它給出了項目的名稱、平均價格和特定年份的計數,如下所示。
name Avg_price_2019 count
---------------------------------
X 23.9 234
Y 21.8 59
SQL:
SELECT
AVG(Amount) Avg_price_2019, name
FROM
(SELECT
name, SUM(price_amount) Amount, COUNT(*)
FROM
myTable
WHERE
(To_date("Activity Date", 'mm-dd-yyyy') >= TO_DATE('09/01/2019', 'mm/dd/yyyy'))
AND (To_date("Activity Date", 'mm-dd-yyyy') <= TO_DATE('09/17/2019','mm/dd/yyyy'))
GROUP BY
name)
GROUP BY
name;
我希望它返回更多年,如下所示
name | Avg price 2018 | count | Avg price 2019 | count
對於 2018 年的結果,我需要相同的查詢,只是更改年份。
如何在同一個查詢中組合這兩個選擇以產生上述結果?
您似乎想要條件聚合。 您的查詢很可能簡化如下:
SELECT
name
AVG(CASE WHEN EXTRACT(YEAR FROM Activity_Date) = 2019 THEN Amount END) avg_price_2019,
SUM(CASE WHEN EXTRACT(YEAR FROM Activity_Date) = 2019 THEN 1 ELSE 0 END) count_2019,
AVG(CASE WHEN EXTRACT(YEAR FROM Activity_Date) = 2018 THEN Amount END) avg_price_2018,
SUM(CASE WHEN EXTRACT(YEAR FROM Activity_Date) = 2018 THEN 1 ELSE 0 END) count_2018
FROM myTable
GROUP BY name
您似乎將日期存儲為字符串,格式為mm-dd-yyyy
。 您可以使用SUBSTR()
提取年份部分,例如:
SELECT
name
AVG(CASE WHEN SUBSTR(Activity_Date, -4) = '2019' THEN Amount END) avg_price_2019,
SUM(CASE WHEN SUBSTR(Activity_Date, -4) = '2019' THEN 1 ELSE 0 END) count_2019,
AVG(CASE WHEN SUBSTR(Activity_Date, -4) = '2018' THEN Amount END) avg_price_2018,
SUM(CASE WHEN SUBSTR(Activity_Date, -4) = '2018' THEN 1 ELSE 0 END) count_2018
FROM myTable
GROUP BY name
最后,如果您想過濾一年中的特定時間段(9 月 1 日至 9 月 17 日),則可以在查詢中添加WHERE
子句。 仍然假設日期存儲為字符串,這可能是:
WHERE SUBSTR(Activity_Date, 1, 5) BETWEEN '09-01' AND '09-17'
在這種情況下,我將使用“假 map 列”
select a.NAME, a.AVG. a.CNT, b.AVG, b.CNT from
(
select '1' as MAP, NAME, AVG, CNT from ... your query [2018 table] ...
) a
left join
(
select '1' as MAP, NAME, AVG, CNT from ... your query [2019 table] ...
) b
on a.MAP = b.MAP
我沒有測試代碼,但我想說的是,您可以在每個表中創建一個虛擬列,然后將它們留在該列上以將它們並排放置。
另外為了獲得更好的性能,我建議在過濾日期時間時使用“BETWEEN”例如:DATE BETWEEN date1 and date2
這是 where 子句:
Create Table myTable
(
myTableID int,
amount int,
price_amount int,
to_date DateTime,
activity_date DateTime
)
Insert Into myTable (myTableID, amount, price_amount, activity_date) values (1, 1, 2, '1/1/2019')
Insert Into myTable (myTableID, amount, price_amount, activity_date) values (1, 1, 4, '1/1/2018')
select * from myTable
Select AVG(amount) as Avg_price_2019,
(SELECT SUM(price_amount) FROM myTable) as test from myTable
where activity_date >= Convert(DateTime, '09/01/2019')
and activity_date <= Convert(DateTime, '09/17/2019')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.