我正在尝试创建一个查询,它将为我提供: - 店名 - 顶级销售员 - 销售人员销售值(value) - 经理姓名
我已经设法创建了以下两个查询。这两个查询都有效,但我只需要帮助将它们连接在一起。
从每家商店获得顶级销售人员。
SELECT MAX(sales) FROM (SELECT shopid, SUM(amount) AS sales
FROM fss_Payment GROUP BY empnin) AS salesdata GROUP BY shopid
获取所有经理及其商店
SELECT s.shopname, e.empname FROM fss_Shop s
JOIN fss_Employee e ON e.shopid = s.shopid AND e.mgrnin=""
ORDER BY s.shopid
现在我需要连接两个查询的结果。我试着像下面那样做:
SELECT * FROM
(SELECT s.shopname, e.empname FROM fss_Shop s
JOIN fss_Employee e ON e.shopid = s.shopid AND e.mgrnin=""
) x
JOIN
(SELECT MAX(sales) FROM (SELECT shopid, SUM(amount) AS sales
FROM fss_Payment GROUP BY empnin) AS salesdata GROUP BY shopid
) y
ON x.shopid = y.shopid
通过此链接查看我的一些表格的外观 - https://www.db-fiddle.com/f/t94XmTEMgXpmSLS3e8HWAh/1
最佳答案
更新
MySQL 8.0 引入窗口函数
https://dev.mysql.com/doc/refman/8.0/en/window-functions.html
下面原答案对MySQL 8.0之前的版本仍然适用。
原始答案
我们认为这会是一件简单的事情。一些数据库为我们提供了分析/窗口功能,这使得这相当容易。在 MySQL 中,我们有两种选择:使用直接的 SQL 方法,或使用一些用户定义的变量来模拟分析函数。
对于直接的 SQL 方法,我们可以一次构建一个查询。
首先,我们可以获得每个商店每个销售人员的总销售额
SELECT p.shopid
, p.empnin
, SUM(p.amount) AS sales
FROM fss_Payment p
GROUP
BY p.shopid
, p.empnin
ORDER
BY p.shopid ASC
, SUM(p.amount) DESC
查看结果并验证这是正确的。然后我们可以将该查询用作另一个查询中的内联 View ,以获得每个商店的“最高”总销售额:
-- get highest total sales for each store
SELECT q.shopid
, MAX(q.sales) AS highest_sales
FROM ( SELECT p.shopid
, p.empnin
, SUM(p.amount) AS sales
FROM fss_payment p
GROUP
BY p.shopid
, p.empnin
) q
GROUP
BY q.shopid
ORDER
BY q.shopid
我们可以获取该结果,并将其加入到每个销售人员/商店的总销售额中,以获得与该商店匹配的“最高”销售额的销售人员
-- get salesperson with the highest total sales for each store
SELECT t.shopid
, t.empnin
, t.sales
FROM ( SELECT q.shopid
, MAX(q.sales) AS highest_sales
FROM ( SELECT p.shopid
, p.empnin
, SUM(p.amount) AS sales
FROM fss_payment p
GROUP
BY p.shopid
, p.empnin
) q
GROUP
BY q.shopid
) r
JOIN ( SELECT s.shopid
, s.empnin
, SUM(s.amount) AS sales
FROM fss_payment s
GROUP
BY s.shopid
, s.empnin
) t
ON t.shopid = r.shopid
AND t.sales = r.highest_sales
如果有两个(或更多)empnin 具有相同的最高总销售额(并列第一),则此查询将返回这两个(或所有)销售人员。
现在我们只需要添加一个连接到 fss_shop 以获取 storename,并添加几个连接到 fss_employee 以获取销售人员姓名,并得到那个销售员的经理
将此添加到查询中,
JOIN fss_shop h
ON h.shopid = t.shopid
LEFT
JOIN fss_employee e
ON e.empnin = t.empnin
LEFT
JOIN fss_employee m
ON m.empnin = e.mgrnin
添加一个order by子句
ORDER BY h.storename, e.empname
并将适当的表达式添加到 SELECT 列表中。
把所有这些放在一起,我们得到这样的东西:
SELECT h.shopname AS `storename`
, e.empname AS `top salesperson`
, t.sales AS `salesperson sales value`
, m.empname AS `manager name`
FROM ( SELECT q.shopid
, MAX(q.sales) AS highest_sales
FROM ( SELECT p.shopid
, p.empnin
, SUM(p.amount) AS sales
FROM fss_payment p
GROUP
BY p.shopid
, p.empnin
) q
GROUP
BY q.shopid
) r
JOIN ( SELECT s.shopid
, s.empnin
, SUM(s.amount) AS sales
FROM fss_payment s
GROUP
BY s.shopid
, s.empnin
) t
ON t.shopid = r.shopid
AND t.sales = r.highest_sales
JOIN fss_shop h
ON h.shopid = t.shopid
LEFT
JOIN fss_employee e
ON e.empnin = t.empnin
LEFT
JOIN fss_employee m
ON m.empnin = e.mgrnin
ORDER BY h.storename, e.empname
要回答您提出的问题,如何将这两个查询连接在一起以获得指定的结果:我认为这两个查询不可能。
返回的 经理姓名 是员工的经理。如果我们想要获得商店的经理,请将 m 的连接条件更改为匹配 h 而不是 e。
我提到的另一种方法是使用用户定义的变量。通过这种方法,每个商店只获得一名“顶级销售人员”会更容易(当规范规定始终存在“决胜局”时。顶级销售人员没有任何关系。)
使用用户定义的变量,我们可能会在处理大型数据集时获得更好的性能。但该方法还依赖于不保证的行为,如 MySQL 引用手册中所述。
关于MySQL - 如何加入两个子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47561248/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为