![](/img/trans.png)
[英]How to count single field twice in one query based on different conditions
[英]How to get multiple results based on two different conditions from one table using single query
我有一张表,其中列出了每天的销售数量以及相关的销售金额。 以下是表SalesMaster。
Date Item Sales Amount
30062018 1 5 50000
30062018 2 5 50000
30062018 3 5 50000
30062018 4 5 50000
30062018 5 5 50000
30062018 6 5 50000
30062018 7 5 50000
31052018 1 5 50000
31052018 2 5 50000
31052018 3 5 50000
31052018 4 5 50000
31052018 5 5 50000
31052018 6 5 50000
从此表中我想得到以下结果。 我想列出每个月底每个商品的销售数量,如下所示。
Item May_Sales June_Sales
1 5000 5000
2 5000 5000
3 5000 5000
4 5000 5000
5 5000 5000
6 5000 5000
7 5000 5000
以下是我编写的代码,但显示为[1]:ORA-01427:单行子查询返回的行多。
SELECT t1.item,
sales AS may_sales,
(SELECT sales
FROM salesmaster t1
WHERE t1.date = '30-June-2018')
AS june_sales
FROM salesmaster t1
WHERE t1.date = '31-May-2018'
我只会使用条件聚合:
SELECT sm.item,
SUM(CASE WHEN t1.date = '31052018' then sales END) as may_sales,
SUM(CASE WHEN t1.date = '30062018' then sales END) as june_sales
FROM salesmaster sm
GROUP BY sm.item
ORDER BY sm.item;
您的第一列看起来并不像日期,因此请勿在其上使用日期比较。 如果是日期,请使用:
SELECT sm.item,
SUM(CASE WHEN t1.date = DATE '2018-05-31' THEN sales END) as may_sales,
SUM(CASE WHEN t1.date = DATE '2018-06-30' THEN sales END) as june_sales
FROM salesmaster sm
GROUP BY sm.item
ORDER BY sm.item;
至于您的查询,它在子查询中的item
上缺少相关子句。
编辑:
如果需要区别,则需要重复这些表达式。 这是一种方法:
SELECT sm.item,
SUM(CASE WHEN t1.date = '31052018' THEN sales END) as may_sales,
SUM(CASE WHEN t1.date = '30062018' THEN sales END) as june_sales,
SUM(CASE WHEN t1.date = '31052018' THEN -sales)
WHEN t1.date = '30062018' THEN sales
END) as diff,
对于您想要获得的结果,条件聚合将是最佳方法:
select
item,
sum(case when to_date(Date, 'DDMMYYYY') between to_date('01052018','YYYYMMDD') and to_date('31052018','DDMMYYYY') then Amount else 0 end) may_sales,
sum(case when to_date(Date, 'DDMMYYYY') between to_date('01062018','YYYYMMDD') and to_date('31062018','DDMMYYYY') then Amount else 0 end) june_sales
from SalesMaster
group by item
order by item;
您必须将“日期”字段转换为有效字段以获取每月总计。
select item, may.sales as MAY_sales, JUNE.sales as JUNE_sales from
(SELECT distinct item
FROM salesmaster )MAST
left join
(SELECT item , sales
FROM salesmaster
WHERE date = '31052018') MAY
on (MAST.item = JUNE.item)
left join
(SELECT item , sales
FROM salesmaster
WHERE date = '31052018') JUNE
on (MAST.item = JUNE.item)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.