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

时间:2017-03-08 17:35:58

标签: sql db2

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

我正在使用DB2。

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

下面的图片显示了前3个用户的所有表元素(cid = 1 OR cid = 2 OR cid = 3)。我的所有查询(一旦合并)的最终目的是找到每个'cid'最大'qnty'的单个'俱乐部'。所以对于'cid = 1','俱乐部'是读者摘要,'qnty'为3.对于'cid = 2','俱乐部'是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'的'club'

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'的'俱乐部',我只需在上一个查询中将文本cid = 1更改为cid = 2。我的查询似乎始终产生正确的结果。我的问题是,如何修改我的查询以在单个表中获得从1到45的所有'cid'的结果?如何获得一张包含所有cid值的表格以及出售该书籍最多的书籍的俱乐部,以及在一张桌子中出售了多少本书?请记住,我希望您可以修改我的查询,而不是提供更好的查询。

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

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

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用OLAP / Window函数来实现此目的:

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 / club组合的总数量。第二个最内层语句(sub2)为每个cid / club组合按数量(自上而下)排序创建row_number。然后,最外层查询仅选择row_number()为1的记录。