我想使用这三个查询:
第一个查询:
SELECT
AMICOS.PNRREG.PN, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastissue
FROM
AMICOS.HISTORYSTOCKFLOAT
INNER JOIN
AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID
WHERE
(((AMICOS.HISTORYSTOCKFLOAT.ACTION)='ISSUE') AND
((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY
AMICOS.PNRREG.PN;
第二个查询:
SELECT
AMICOS.PNRREG.PN, Max(AMICOS.HISTORY.HISTORYDATE) AS lastissuehistory
FROM
AMICOS.HISTORY
INNER JOIN
AMICOS.PNRREG ON AMICOS.HISTORY.PARTID = AMICOS.PNRREG.PARTID
WHERE
(((AMICOS.HISTORY.HISTORYACTION)='ISSUE') AND
((AMICOS.HISTORY.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY
AMICOS.PNRREG.PN;
第三个查询:
SELECT
AMICOS.PNRREG.PN, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastpurchase
FROM
AMICOS.HISTORYSTOCKFLOAT
INNER JOIN
AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID
WHERE
(((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY
AMICOS.PNRREG.PN, AMICOS.HISTORYSTOCKFLOAT.ACTION
HAVING
(((AMICOS.HISTORYSTOCKFLOAT.ACTION)='PURCHASE'));
最后一个查询将这些放在一起:
SELECT AMICOS.PNRREG.PN, AMICOS.IRCABCCAT.ABC_CATEGORY, AMICOS.IRC.PRIMUTILISATION, AMICOS.PNRREG.DESCRIPTION, AMICOS.HISTORYSTOCKFLOAT.ACCOUNTNO, AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE, AMICOS.HISTORYSTOCKFLOAT.STOCK_FLOAT, AMICOS.HISTORYSTOCKFLOAT.STOCK_PRICE, AMICOS.HISTORYSTOCKFLOAT.STOCKVALUE, lastpurchase.lastpurchase, lastissue.lastissue, lastissuehistory.lastissuehistory
FROM ((AMICOS.PNRREG LEFT JOIN lastissuehistory ON AMICOS.PNRREG.PN = lastissuehistory.PN LEFT JOIN lastissue ON AMICOS.PNRREG.PN = lastissue.PN)
LEFT JOIN lastpurchase ON AMICOS.PNRREG.PN = lastpurchase.PN);
我已经尝试了 UNION、JOIN 将这些查询放在一起,以从最后一个查询中获得一个结果,该结果取决于其他三个查询。
当我对前三个查询进行预定义查询时,它适用于 MS Access。但它不适用于Oracle SQL Developer查询工具。
我怎样才能做到这一点?
看起来CTE
(公用表表达式,即WITH
分解子句(可能会有所帮助。像这样:
with
first as (select pn, ... from ...),
second as (select pn, ... from ...),
third as (select pn, ... from ...)
-- now, join them
select f.pn, s.some_column, t.some_other_column
from first f join second s on s.pn = f.pn
join third t on t.pn = f.pn
您可以使用With 或以下选项
SELECT
AMICOS.PNRREG.PN,
AMICOS.IRCABCCAT.ABC_CATEGORY,
AMICOS.IRC.PRIMUTILISATION,
AMICOS.PNRREG.DESCRIPTION,
AMICOS.HISTORYSTOCKFLOAT.ACCOUNTNO,
AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE,
AMICOS.HISTORYSTOCKFLOAT.STOCK_FLOAT,
AMICOS.HISTORYSTOCKFLOAT.STOCK_PRICE,
AMICOS.HISTORYSTOCKFLOAT.STOCKVALUE,
lastpurchase.lastpurchase,
lastissue.lastissue,
lastissuehistory.lastissuehistory
FROM
AMICOS.PNRREG
LEFT JOIN (SELECT
AMICOS.PNRREG.PN,
Max(AMICOS.HISTORY.HISTORYDATE) AS lastissuehistory
FROM
AMICOS.HISTORY
INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORY.PARTID = AMICOS.PNRREG.PARTID
WHERE (((AMICOS.HISTORY.HISTORYACTION)='ISSUE') AND ((AMICOS.HISTORY.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY AMICOS.PNRREG.PN) lastissuehistory ON AMICOS.PNRREG.PN = lastissuehistory.PN
LEFT JOIN (SELECT
AMICOS.PNRREG.PN,
Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastissue
FROM
AMICOS.HISTORYSTOCKFLOAT
INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID
WHERE
(((AMICOS.HISTORYSTOCKFLOAT.ACTION)='ISSUE') AND ((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY AMICOS.PNRREG.PN)lastissue ON AMICOS.PNRREG.PN = lastissue.PN
LEFT JOIN (SELECT
AMICOS.PNRREG.PN,
Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastpurchase
FROM
AMICOS.HISTORYSTOCKFLOAT
INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID
WHERE (((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY AMICOS.PNRREG.PN, AMICOS.HISTORYSTOCKFLOAT.ACTION
HAVING (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='PURCHASE'))) lastpurchase ON AMICOS.PNRREG.PN = lastpurchase.PN
@Littlefoot 我尝试了这样的事情:
WITH
first as (SELECT AMICOS.PNRREG.PN, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastissue FROM AMICOS.HISTORYSTOCKFLOAT INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID WHERE (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='ISSUE') AND ((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1)) GROUP BY AMICOS.PNRREG.PN),
second as (SELECT AMICOS.PNRREG.PN, Max(AMICOS.HISTORY.HISTORYDATE) AS lastissuehistory
FROM AMICOS.HISTORY INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORY.PARTID = AMICOS.PNRREG.PARTID
WHERE (((AMICOS.HISTORY.HISTORYACTION)='ISSUE') AND ((AMICOS.HISTORY.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY AMICOS.PNRREG.PN),
third as (SELECT AMICOS.PNRREG.PN, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastpurchase
FROM AMICOS.HISTORYSTOCKFLOAT INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID
WHERE (((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY AMICOS.PNRREG.PN, AMICOS.HISTORYSTOCKFLOAT.ACTION
HAVING (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='PURCHASE')))
SELECT AMICOS.PNRREG.PN, AMICOS.IRCABCCAT.ABC_CATEGORY, AMICOS.IRC.PRIMUTILISATION,
AMICOS.PNRREG.DESCRIPTION, AMICOS.HISTORYSTOCKFLOAT.ACCOUNTNO,
AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE, AMICOS.HISTORYSTOCKFLOAT.STOCK_FLOAT,
AMICOS.HISTORYSTOCKFLOAT.STOCK_PRICE, AMICOS.HISTORYSTOCKFLOAT.STOCKVALUE,
lastpurchase.lastpurchase, lastissue.lastissue, lastissuehistory.lastissuehistory
FROM ((AMICOS.PNRREG LEFT JOIN lastpurchase ON AMICOS.PNRREG.PN = lastpurchase.PN
LEFT JOIN lastissue ON AMICOS.PNRREG.PN = lastissue.PN) LEFT JOIN lastissuehistory ON
AMICOS.PNRREG.PN = lastissuehistory.PN;
但它一直告诉我"选择列表与 GROUP BY 不一致;将分组依据条款修改为:AMICOS.PNRREG.PN,AMICOS。历史股票浮动。行动,马克斯(阿米科斯。历史股票浮动。历史日期(">
问候 埃内拉克
在本指南的帮助下,我设法完成了这项工作: 在 SSRS 中使用查找集函数
来自凯瑟琳熊的一句话。
问候
埃内拉克