一列作为参数同时具有和在哪里(不包括)
One column as parameter both having and where (excluding)
我有两个疑问:
第一个:
select p.prodid, p.name, max(b.ldate) as lastsale
from prod p, buy b
where p.id = b.idprod and b.id<>0 and b.wskus=0 and b.bufor=0
group by p.prodid, p.name
HAVING sum(b.curNo)=0
order by p.name asc
第二
select p.prodid, p.name, min(b.buydate) as oldest_buy
from prod p, buy b
where p.id = b.idprod and b.id<>0 and b.wskus=0 and b.bufor=0 and b.curNo>0
group by p.prodid, p.name
order by p.name asc
我怎样才能让他们加入结果列:
| p.prodid | p.name | lastsale | oldest_buy |
| 1 | ex1 | 1.1.18 | NULL |
| 2 | ex2 | NULL | 1.1.18 |
因为第一个查询的 HAVING sum(b.curNo)=0
是第二个查询的 WHERE
参数所独有的 b.curNo>0
我有问题如何使它工作。
将第一个查询放在联合所有之前的子查询中。试试这个:
select
t.prodid, t.name, t.lastsale, null as oldest_buy
from (select p.prodid, p.name,
max(b.ldate) as lastsale
from prod p, buy b
where p.id = b.idprod and b.id<>0 and
b.wskus=0 and b.bufor=0
group by p.prodid, p.name
HAVING sum(b.curNo)=0 ) t
union all
( select p.prodid, p.name,
null as lastsale, min(b.buydate) as oldest_buy
from prod p, buy b
where p.id = b.idprod and b.id<>0 and b.wskus=0
and b.bufor=0 and b.curNo>0
group by p.prodid, p.name )
order by 2 asc
如果没有您的输入数据,很难判断,但这可能对您有用...
SELECT
p.prodid,
p.name,
MIN(CASE WHEN b.curNo > 0 THEN b.buydate END) AS oldest_buy, -- MIN(buydate) WHERE curno>0
CASE WHEN SUM(b.curNo) = 0 THEN MAX(b.ldate) END AS lastsale -- MAX(ldate) HAVING SUM(curNo) = 0
FROM
prod p
INNER JOIN -- Don't use "," use "JOIN"s, the standard for about 25 years...
buy b
ON p.id = b.idprod
WHERE
b.id <> 0
AND b.wskus = 0
AND b.bufor = 0
GROUP BY
p.prodid,
p.name
ORDER BY
p.name ASC
将 b.curNo > 0
或 SUM(b.curNo) = 0
移动到 CASE
语句中可能会产生额外的行,具体取决于您的数据行为。如果没有更多细节或示例数据,就无法判断。
两次计算的值都可以,但是行数我就说不准了
为了更明确地说明它,你可以做...
SELECT
p.prodid,
p.name,
CASE WHEN MAX(b.curNo) > 0 THEN MIN(CASE WHEN b.curNo > 0 THEN b.buydate END) END AS oldest_buy,
CASE WHEN SUM(b.curNo) = 0 THEN MAX(b.ldate) END AS lastsale
FROM
prod p
INNER JOIN -- Don't use "," use "JOIN"s, the standard for about 25 years...
buy b
ON p.id = b.idprod
WHERE
b.id <> 0
AND b.wskus = 0
AND b.bufor = 0
GROUP BY
p.prodid,
p.name
HAVING
SUM(b.curNo) = 0
OR MAX(b.curNo) > 0
ORDER BY
p.name ASC
另一种可能性(同样是因为您没有提供示例数据) 是聚合然后加入。
这是基于您的意思是 p.curNo
而不是 b.curNo
...
SELECT
p.prodid,
p.name,
CASE p.curNo > 0 THEN b.oldest_buy END AS oldest_buy,
CASE p.curNo = 0 THEN b.last_sale END AS lastsale
FROM
prod p
INNER JOIN -- Don't use "," use "JOIN"s, the standard for about 25 years...
(
SELECT
idprod,
MIN(buydate) AS oldest_buy,
MAX(ldate) AS last_sale
FROM
buy
WHERE
b.id <> 0
AND b.wskus = 0
AND b.bufor = 0
)
b
ON p.id = b.idprod
ORDER BY
p.name ASC
我有两个疑问:
第一个:
select p.prodid, p.name, max(b.ldate) as lastsale
from prod p, buy b
where p.id = b.idprod and b.id<>0 and b.wskus=0 and b.bufor=0
group by p.prodid, p.name
HAVING sum(b.curNo)=0
order by p.name asc
第二
select p.prodid, p.name, min(b.buydate) as oldest_buy
from prod p, buy b
where p.id = b.idprod and b.id<>0 and b.wskus=0 and b.bufor=0 and b.curNo>0
group by p.prodid, p.name
order by p.name asc
我怎样才能让他们加入结果列:
| p.prodid | p.name | lastsale | oldest_buy |
| 1 | ex1 | 1.1.18 | NULL |
| 2 | ex2 | NULL | 1.1.18 |
因为第一个查询的 HAVING sum(b.curNo)=0
是第二个查询的 WHERE
参数所独有的 b.curNo>0
我有问题如何使它工作。
将第一个查询放在联合所有之前的子查询中。试试这个:
select
t.prodid, t.name, t.lastsale, null as oldest_buy
from (select p.prodid, p.name,
max(b.ldate) as lastsale
from prod p, buy b
where p.id = b.idprod and b.id<>0 and
b.wskus=0 and b.bufor=0
group by p.prodid, p.name
HAVING sum(b.curNo)=0 ) t
union all
( select p.prodid, p.name,
null as lastsale, min(b.buydate) as oldest_buy
from prod p, buy b
where p.id = b.idprod and b.id<>0 and b.wskus=0
and b.bufor=0 and b.curNo>0
group by p.prodid, p.name )
order by 2 asc
如果没有您的输入数据,很难判断,但这可能对您有用...
SELECT
p.prodid,
p.name,
MIN(CASE WHEN b.curNo > 0 THEN b.buydate END) AS oldest_buy, -- MIN(buydate) WHERE curno>0
CASE WHEN SUM(b.curNo) = 0 THEN MAX(b.ldate) END AS lastsale -- MAX(ldate) HAVING SUM(curNo) = 0
FROM
prod p
INNER JOIN -- Don't use "," use "JOIN"s, the standard for about 25 years...
buy b
ON p.id = b.idprod
WHERE
b.id <> 0
AND b.wskus = 0
AND b.bufor = 0
GROUP BY
p.prodid,
p.name
ORDER BY
p.name ASC
将 b.curNo > 0
或 SUM(b.curNo) = 0
移动到 CASE
语句中可能会产生额外的行,具体取决于您的数据行为。如果没有更多细节或示例数据,就无法判断。
两次计算的值都可以,但是行数我就说不准了
为了更明确地说明它,你可以做...
SELECT
p.prodid,
p.name,
CASE WHEN MAX(b.curNo) > 0 THEN MIN(CASE WHEN b.curNo > 0 THEN b.buydate END) END AS oldest_buy,
CASE WHEN SUM(b.curNo) = 0 THEN MAX(b.ldate) END AS lastsale
FROM
prod p
INNER JOIN -- Don't use "," use "JOIN"s, the standard for about 25 years...
buy b
ON p.id = b.idprod
WHERE
b.id <> 0
AND b.wskus = 0
AND b.bufor = 0
GROUP BY
p.prodid,
p.name
HAVING
SUM(b.curNo) = 0
OR MAX(b.curNo) > 0
ORDER BY
p.name ASC
另一种可能性(同样是因为您没有提供示例数据) 是聚合然后加入。
这是基于您的意思是 p.curNo
而不是 b.curNo
...
SELECT
p.prodid,
p.name,
CASE p.curNo > 0 THEN b.oldest_buy END AS oldest_buy,
CASE p.curNo = 0 THEN b.last_sale END AS lastsale
FROM
prod p
INNER JOIN -- Don't use "," use "JOIN"s, the standard for about 25 years...
(
SELECT
idprod,
MIN(buydate) AS oldest_buy,
MAX(ldate) AS last_sale
FROM
buy
WHERE
b.id <> 0
AND b.wskus = 0
AND b.bufor = 0
)
b
ON p.id = b.idprod
ORDER BY
p.name ASC