如何修改查询以遍历整个表格而不是单个页面

如何修改查询以遍历整个表格而不是单个页面

问题描述:

我写了几个SQL查询并对我的表执行它们。每个单独的查询工作。我一直在添加功能,直到我有一个非常难看的工作查询。问题是每次我想使用它时都必须手动更改一个值。你能帮助自动而不是“手动”的查询吗?如何修改查询以遍历整个表格而不是单个页面

我正在使用DB2。

下表显示了客户(cid)从1到3.'club'是图书销售商,'qnty'是客户从每个'俱乐部'购买的图书数量。全表有45个客户。 enter image description here

下图显示了前3个用户(cid = 1或cid = 2或cid = 3)的所有表格元素。我的所有查询(一旦合并)的最终目的是找到每个'cid'具有最大'qnty'的单个'俱乐部'。因此对于'cid = 1','俱乐部'是'qnty'为3的读者文摘。对于'cid = 2','club'是YRB Gold,其中'qnty'是5.一直到cid 45达到。

enter image description here

为了给你什么,我在这里做一个背景是我的疑问:

(查询1起为cid=1点)

SELECT * FROM yrb_purchase WHERE cid=1 enter image description here

(查询2 - 找到cid = 1的'qnty'最高的'俱乐部')

SELECT * 
FROM 
(SELECT club, 
     sum(qnty) AS t_qnty 
FROM yrb_purchase 
WHERE cid=1 
GROUP BY club)results 
ORDER BY t_qnty DESC 

enter image description here

(查询3 - 从上面的查询相结合的纪录,这是CID)

SELECT cid, 
    temp.club, 
    temp.t_qnty 
FROM yrb_purchase AS p, 

(SELECT * 
FROM 
    (SELECT club, 
      sum(qnty) AS t_qnty 
    FROM yrb_purchase 
    WHERE cid=1 
    GROUP BY club)results 
ORDER BY t_qnty DESC FETCH FIRST 1 ROWS ONLY) AS TEMP 
WHERE p.cid=1 
AND p.club=temp.club 

enter image description here

(查询4)确保有用于CID只有一条记录= 1

SELECT cid, 
    temp.club, 
    temp.t_qnty 
FROM yrb_purchase AS p, 

(SELECT * 
FROM 
    (SELECT club, 
      sum(qnty) AS t_qnty 
    FROM yrb_purchase 
    WHERE cid=1 
    GROUP BY club)results 
ORDER BY t_qnty DESC FETCH FIRST 1 ROWS ONLY) AS TEMP 
WHERE p.cid=1 
AND p.club=temp.club FETCH FIRST ROWS ONLY 

enter image description here

要让客户2获得'qnty'最高的'club',我只需在上面的最后一个查询中将文本cid = 1更改为cid = 2。我的查询似乎总是会产生正确的结果。我的问题是,如何修改我的查询以获得单个表中所有'cid's从1到45的结果?我该如何获得一张包含所有cid值的表格以及出售cid最多书籍的俱乐部,以及在一个tablei内销售了多少本书?请记住,我希望您可以修改我的查询,而不是提供更好的查询。

如果您认为我的查询太难看(我同意你)并选择提供另一个查询,请注意,我刚开始学习SQL,可能无法理解您的查询。你应该知道我已经问过这个问题:For common elements, how to find the value based on two columns? SQL但我无法做出答案的工作(由于我的SQL限制 - 不是因为答案不好);在没有工作答案的情况下,我无法对其进行逆向工程,以了解它是如何工作的。 在此先感谢

****************************编辑#1 *********** ******************************** 答案的结果是:

enter image description here

+0

请阅读http://meta.*.com/questions/285551/why-may-i-not-upload-images-of-code在此提问/ 285557和接受的答案 –

你可以使用OLAP /窗口功能来实现这一目标:

SELECT 
    cid, 
    club, 
    qnty 
FROM 
    (
     SELECT 
      cid, 
      club, 
      qnty, 
      ROW_NUMBER() OVER (PARTITION BY cid order by qnty desc) as cid_club_rank 
     FROM 
      (
       SELECT 
        cid, 
        club, 
        sum(qnty) as qnty 
       FROM yrb_purchase 
       GROUP BY cid, club 
      ) as sub1 
    ) as sub2 
WHERE cid_club_rank = 1 

最里面的语句(SUB1)刚刚抓住一个总量为每个CID /俱乐部组合。第二个内部最大声明(sub2)为每个按数量排序的每个cid/club组合创建一个row_number(自上而下)。然后,最外面的查询只选择row_number()为1的记录。

+0

感谢您的帮助!当我运行你的查询时,我得到一个错误。消息是:'SQL0104N在“(qnty)as qnty,FROM”后面找到了一个意外标记“yrb_purchase”。预期的标记可能包括:“FROM”。 SQLSTATE = 42601'有什么建议吗? – Mike

+0

对不起,那里有一个流浪的逗号。 – JNevill

+0

对不起,打扰你...我试图让答案工作,但我一直打墙我不明白。现在是错误'SQL0440N找不到具有兼容参数的“FUNCTION”类型的名为“SUB”的授权例程。 SQLSTATE = 42884'。我试图在网上找到'sub()'函数来理解它,但奇怪的是,我没有太多运气。再一次,真的很感激你的时间! – Mike