如何修改查询以遍历整个表格而不是单个页面
我写了几个SQL查询并对我的表执行它们。每个单独的查询工作。我一直在添加功能,直到我有一个非常难看的工作查询。问题是每次我想使用它时都必须手动更改一个值。你能帮助自动而不是“手动”的查询吗?如何修改查询以遍历整个表格而不是单个页面
我正在使用DB2。
下表显示了客户(cid)从1到3.'club'是图书销售商,'qnty'是客户从每个'俱乐部'购买的图书数量。全表有45个客户。
下图显示了前3个用户(cid = 1或cid = 2或cid = 3)的所有表格元素。我的所有查询(一旦合并)的最终目的是找到每个'cid'具有最大'qnty'的单个'俱乐部'。因此对于'cid = 1','俱乐部'是'qnty'为3的读者文摘。对于'cid = 2','club'是YRB Gold,其中'qnty'是5.一直到cid 45达到。
为了给你什么,我在这里做一个背景是我的疑问:
(查询1起为cid=1
点)
SELECT * FROM yrb_purchase WHERE cid=1
(查询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
(查询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'最高的'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 *********** ******************************** 答案的结果是:
你可以使用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的记录。
感谢您的帮助!当我运行你的查询时,我得到一个错误。消息是:'SQL0104N在“(qnty)as qnty,FROM”后面找到了一个意外标记“yrb_purchase”。预期的标记可能包括:“FROM”。 SQLSTATE = 42601'有什么建议吗? – Mike
对不起,那里有一个流浪的逗号。 – JNevill
对不起,打扰你...我试图让答案工作,但我一直打墙我不明白。现在是错误'SQL0440N找不到具有兼容参数的“FUNCTION”类型的名为“SUB”的授权例程。 SQLSTATE = 42884'。我试图在网上找到'sub()'函数来理解它,但奇怪的是,我没有太多运气。再一次,真的很感激你的时间! – Mike
请阅读http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code在此提问/ 285557和接受的答案 –