我写了几个SQL查询并对我的表执行了它们。每个查询都有效。我一直在添加功能,直到我得到一个非常难看的工作查询。问题是每次我想使用它时都必须手动更改一个值。你能帮助自动而不是“手动”进行查询吗?
我正在使用DB2。
下表显示了1到3的客户(cid)。'club'是图书销售商,'qnty'是客户从每个'俱乐部'购买的图书数量。全表有45个客户。
下面的图片显示了前3个用户的所有表元素(cid = 1 OR cid = 2 OR cid = 3)。我的所有查询(一旦合并)的最终目的是找到每个'cid'最大'qnty'的单个'俱乐部'。所以对于'cid = 1','俱乐部'是读者摘要,'qnty'为3.对于'cid = 2','俱乐部'是YRB Gold,'qnty'为5.一直持续直到达到cid 45。
为了让您了解我在这里所做的工作是我的疑问:
(查询1 - cid=1
的起点)
SELECT * FROM yrb_purchase WHERE cid=1
(查询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
(查询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
(查询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
要获得客户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 **************** *************************** 答案的结果是:
答案 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的记录。