Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PLSQL:在单个查询中获取一周中每一天的总和和一周的总和_Sql_Oracle_Plsql_Group By_Pivot - Fatal编程技术网

PLSQL:在单个查询中获取一周中每一天的总和和一周的总和

PLSQL:在单个查询中获取一周中每一天的总和和一周的总和,sql,oracle,plsql,group-by,pivot,Sql,Oracle,Plsql,Group By,Pivot,比如说,我有一张桌子,ClientTrade,就像这样: ClientName , TradeDate , Quantity 我想在Oracle PLSQL中创建一个查询,该查询将返回如下结果: 天数来自TradeDate列,Mon=sumQuantity代表Mon,Tue=sumQuantity代表Tue。。。等等 ClientName Mon Tue Wed Thu Fri Sat Sun TotalForWeek ABC 10 15 5 2 4 0

比如说,我有一张桌子,ClientTrade,就像这样:

ClientName , TradeDate , Quantity
我想在Oracle PLSQL中创建一个查询,该查询将返回如下结果: 天数来自TradeDate列,Mon=sumQuantity代表Mon,Tue=sumQuantity代表Tue。。。等等

ClientName  Mon Tue Wed Thu Fri Sat Sun TotalForWeek
ABC         10  15  5   2   4   0   0   34
XYZ         1   1   2   1   2   0   0   7 
假设此报告始终具有使其运行一周的where条件,是否可以在单个查询中创建此报告

子查询

select ClientName, 
(select sum(b.quantity) 
from table b where b.clientName = a.clientname 
and b.tradedate = [some constant or calculation that identifies monday])  
as Mon,
(select sum(b.quantity) 
from table b where b.clientName = a.clientname 
and b.tradedate = [some constant or calculation that identifies tuesday])  
as Tue,

..etc..
from table a
一种更干净,但可能效率更低的方法涉及到一个带有groupby:ew的视图

create view quantityperday as
select clientname, 
tradedate, 
dayofweek(tradedate) as dow, 
weekofyear(tradedate) as woy, 
year(tradedate) as y,
sum(quantity) as quantity
from table 
group by clientname, tradedate;
然后:

这变得难看的原因是我们将行旋转为列

让我们看看:

SELECT Client, MonSum, TueSum, WedSum, ThuSum, FriSum, SatSum, SunSum, TotSum
    FROM (SELECT ClientName AS Client, SUM(Quantity) AS MonSum
             FROM Trades
             WHERE DayOfWeek(TradeDate) = 'Monday'
               AND TradeDate BETWEEN DATE '..Monday..' AND DATE '..Sunday..'
             GROUP BY ClientName
         ) AS MonData
         JOIN
         (SELECT ClientName AS Client, SUM(Quantity) AS TueSum ...
         ) AS TueData ON Mondata.Client = TueData.Client
         JOIN
         ...
         (SELECT ClientName AS Client, SUM(Quantity) AS TotSum
             FROM Trades
             WHERE TradeDate BETWEEN DATE '..Monday..' AND DATE '..Sunday..'
             GROUP BY ClientName
         ) AS TotData ON MonData.Client = TotData.Client
    ORDER BY Client;

不整洁,但正如@tpdi在他的回答中提到的,这是因为我们将行旋转为列。我使用了一致的交易日期。。。条款涵盖相关周。

谢谢您的回答。实际上,我在plsql中发现了一些很好的结果:

select clientname,
max(decode(trim(dow),'MONDAY',totalquantity,0)) Mon,
max(decode(trim(dow),'TUESDAY',totalquantity,0)) Tue,
max(decode(trim(dow),'WEDNESDAY',totalquantity,0)) Wed,
max(decode(trim(dow),'THURSDAY',totalquantity,0)) Thu,
max(decode(trim(dow),'FRIDAY',totalquantity,0)) Fri,
(
max(decode(trim(dow),'MONDAY',totalquantity,0)) +
max(decode(trim(dow),'TUESDAY',totalquantity,0)) +
max(decode(trim(dow),'WEDNESDAY',totalquantity,0)) +
max(decode(trim(dow),'THURSDAY',totalquantity,0)) +
max(decode(trim(dow),'FRIDAY',totalquantity,0)) 
) TOTAL
from 
(
  select clientname, 
  to_char(tradedate, 'DAY') as dow, 
  sum(quantity) as totalquantity
  from ClientTrade a
  where a.tradedate >= trunc(sysdate-7,'D')
  and a.tradedate <= trunc(sysdate-7,'D') + 4
  group by c.clientshortname, tradedate
)
group by clientname

只是简单一点

SELECT ClientName, 
       SUM(CASE WHEN to_char(TradeDate,'DY')='MON' THEN Quantity ELSE NULL END) AS Mon,
       SUM(CASE WHEN to_char(TradeDate,'DY')='TUE' THEN Quantity ELSE NULL END) AS Tue,
       SUM(CASE WHEN to_char(TradeDate,'DY')='WED' THEN Quantity ELSE NULL END) AS Wed,
       SUM(CASE WHEN to_char(TradeDate,'DY')='THU' THEN Quantity ELSE NULL END) AS Thu,
       SUM(CASE WHEN to_char(TradeDate,'DY')='FRI' THEN Quantity ELSE NULL END) AS Fri,
       SUM(CASE WHEN to_char(TradeDate,'DY')='SAT' THEN Quantity ELSE NULL END) AS Sat,
       SUM(CASE WHEN to_char(TradeDate,'DY')='SUN' THEN Quantity ELSE NULL END) AS Sun,
       SUM(Quantity) AS TotalForWeek
FROM  ClientTrade
GROUP BY ClientName
我在Oracle 11G上的试用:

select clientname, nvl(MON,0) MON,  nvl(TUE,0) TUE, nvl(WED,0) WED, nvl(THU,0) THU, nvl(FRI,0) FRI, nvl(SAT,0) SAT, nvl(SUN,0) SUN,
nvl(MON,0) +  nvl(TUE,0) + nvl(WED,0) + nvl(THU,0) + nvl(FRI,0) +nvl(SAT,0) + nvl(SUN,0) TotalForWeek
from 
(
select   clientname,to_char(tradedate,'Dy') dw, sum(quantity) quantity from ClientTrade
group by clientname,  to_char(tradedate,'Dy')
)
pivot (sum(quantity) FOR dw in ('Mon' as MON,'Tue' as TUE,'Wed' AS WED,'Thu' AS THU,'Fri' AS FRI,'Sat' AS SAT,'Sun' AS SUN) )   

这很有趣——几乎每一次,人们都忘记给桌子命名。SQL问题95%一致。第一个表的名称始终为a;好啊干得好。在我看来,这并没有多大区别。但最好是5%:然而,与其他答案不同,它非常以pl/sql为中心。什么是pl/sql?这只是SQL。对你有效,但对我无效。在我的NLS设置中,日期被命名为MONTAG、DIENSTAG、MITTWOCH等。换句话说,您的解决方案取决于区域设置。
select clientname, nvl(MON,0) MON,  nvl(TUE,0) TUE, nvl(WED,0) WED, nvl(THU,0) THU, nvl(FRI,0) FRI, nvl(SAT,0) SAT, nvl(SUN,0) SUN,
nvl(MON,0) +  nvl(TUE,0) + nvl(WED,0) + nvl(THU,0) + nvl(FRI,0) +nvl(SAT,0) + nvl(SUN,0) TotalForWeek
from 
(
select   clientname,to_char(tradedate,'Dy') dw, sum(quantity) quantity from ClientTrade
group by clientname,  to_char(tradedate,'Dy')
)
pivot (sum(quantity) FOR dw in ('Mon' as MON,'Tue' as TUE,'Wed' AS WED,'Thu' AS THU,'Fri' AS FRI,'Sat' AS SAT,'Sun' AS SUN) )