【问题标题】:Oracle Not a single-group group function: writing queriesOracle 非单组组函数:编写查询
【发布时间】:2012-03-03 05:54:24
【问题描述】:

我的查询子查询中有错误。我一直在努力解决这个问题几个小时,直到我最近放弃了。有谁有 oracle DBA 方面的专业知识吗?

如何编写此查询?我需要一个使用聚合 max() 和 sum() 的子查询。

select at.au_id, 
    ((price*sales)*royalty_rate), 
    max(royalty_share) 
from royalties, titles, author_titles at 
group by royalty_rate 
having  max(royalty_share) = (select max((price*sales)*royalty_rate) 
    from author_titles, titles, royalties 
    group by rollup (royalty_rate, royalty_share, au_id));

这是我所拥有的,我需要使用 group by rollup 或 group by cube

这是一个问题: [1] 列出因写书而获得最大报酬的作者, 并收到赔偿。如果涉及超过 1 个作者,请列出总报酬 并为每位作者提供补偿。提示:出版商分配预付款和版税 评价一本书。此信息可在版税表中找到。版税率为 应用于图书收入以确定版税支付。金额 向每位作者支付的预付款和版税由版税份额确定 author_titles 表中的字段。这个解决方案涉及一个子查询来找到最大值 版税支付。

您可以将表格复制并粘贴到您喜欢使用的任何内容中。谢谢。 我的桌子是:

DROP TABLE authors;
CREATE TABLE authors
 (
 au_id    CHAR(3)     NOT NULL,
 fname VARCHAR(15) NOT NULL,
 lname VARCHAR(15) NOT NULL,
 phone    VARCHAR(12)         ,
 address  VARCHAR(20)         ,
 city     VARCHAR(15)         ,
 state    CHAR(2)             ,
 zip      CHAR(5)             ,
CONSTRAINT authors_pk PRIMARY KEY (au_id)
);
INSERT INTO authors VALUES('A01','Sarah','Buchman','718-496-7223','75 West 205 St','Bronx','NY','10468');
INSERT INTO authors VALUES('A02','Wendy','Heydemark','303-986-7020','2922 Baseline Rd','Boulder','CO','80303');
INSERT INTO authors VALUES('A03','Hallie','Hull','415-549-4278','3800 Waldo Ave, #14F','San Francisco','CA','94123');
INSERT INTO authors VALUES('A04','Klee','Hull','415-549-4278','3800 Waldo Ave, #14F','San Francisco','CA','94123');
INSERT INTO authors VALUES('A05','Christian','Kells','212-771-4680','114 Horatio St','New York','NY','10014');
INSERT INTO authors VALUES('A06',' ','Kellsey','650-836-7128','390 Serra Mall','Palo Alto','CA','94305');
INSERT INTO authors VALUES('A07','Paddy','O''Furniture','941-925-0752','1442 Main St','Sarasota','FL','34236');



DROP TABLE titles;
CREATE TABLE titles
  (
  title_id   CHAR(3)      NOT NULL,
  title VARCHAR(40)  NOT NULL,
  genre       VARCHAR(10)          ,
  pub_id     CHAR(3)      NOT NULL,
  pages      INTEGER              ,
  price      DECIMAL(5,2)         ,
  sales      INTEGER              ,
  pubdate    DATE                 ,
  contract   SMALLINT     NOT NULL,
  CONSTRAINT titles_pk PRIMARY KEY (title_id), 
  CONSTRAINT Titles_pub_fk FOREIGN KEY (Pub_id)
    REFERENCES Publishers (Pub_id)
  );

INSERT INTO titles VALUES('T01','1977!','history','P01',107,21.99,566,DATE '2000-08-01',1);
INSERT INTO titles VALUES('T02','200 Years of German Humor','history','P03',14,19.95,9566,DATE '1998-04-01',1);
INSERT INTO titles VALUES('T03','Ask Your System Administrator','computer','P02',1226,39.95,25667,DATE '2000-09-01',1);
INSERT INTO titles VALUES('T04','But I Did It Unconsciously','psychology','P04',510,12.99,13001,DATE '1999-05-31',1);
INSERT INTO titles VALUES('T05','Exchange of Platitudes','psychology','P04',201,6.95,201440,DATE '2001-01-01',1);
INSERT INTO titles VALUES('T06','How About Never?','biography','P01',473,19.95,11320,DATE '2000-07-31',1);
INSERT INTO titles VALUES('T07','I Blame My Mother','biography','P03',333,23.95,1500200,DATE '1999-10-01',1);
INSERT INTO titles VALUES('T08','Just Wait Until After School','children','P04',86,10.00,4095,DATE '2001-06-01',1);
INSERT INTO titles VALUES('T09','Kiss My Boo-Boo','children','P04',22,13.95,5000,DATE '2002-05-31',1);
INSERT INTO titles VALUES('T10','Not Without My Faberge Egg','biography','P01',NULL,NULL,NULL,NULL,0);
INSERT INTO titles VALUES('T11','Perhaps It''s a Glandular Problem','psychology','P04',826,7.99,94123,DATE '2000-11-30',1);
INSERT INTO titles VALUES('T12','Spontaneous, Not Annoying','biography','P01',507,12.99,100001,DATE '2000-08-31',1);
INSERT INTO titles VALUES('T13','What Are The Civilian Applications?','history','P03',802,29.99,10467,DATE '1999-05-31',1);


DROP TABLE author_titles;
CREATE TABLE author_titles
  (
  au_id         CHAR(3)      NOT NULL,  
  title_id      CHAR(3)      NOT NULL,
  au_order      SMALLINT     NOT NULL,
  royalty_share DECIMAL(5,2) NOT NULL,
  CONSTRAINT authors_titles_pk PRIMARY KEY (au_id, title_id),
  CONSTRAINT author_titles_au_fk FOREIGN KEY (au_id) 
    REFERENCES Authors (au_id),
  CONSTRAINT author_titles_titles_pk FOREIGN KEY (title_id) 
    REFERENCES Titles (title_id)
  );

INSERT INTO author_titles VALUES('A01','T01',1,1.0);
INSERT INTO author_titles VALUES('A01','T02',1,1.0);
INSERT INTO author_titles VALUES('A05','T03',1,1.0);
INSERT INTO author_titles VALUES('A03','T04',1,0.6);
INSERT INTO author_titles VALUES('A04','T04',2,0.4);
INSERT INTO author_titles VALUES('A04','T05',1,1.0);
INSERT INTO author_titles VALUES('A02','T06',1,1.0);
INSERT INTO author_titles VALUES('A02','T07',1,0.5);
INSERT INTO author_titles VALUES('A04','T07',2,0.5);
INSERT INTO author_titles VALUES('A06','T08',1,1.0);
INSERT INTO author_titles VALUES('A06','T09',1,1.0);
INSERT INTO author_titles VALUES('A02','T10',1,1.0);
INSERT INTO author_titles VALUES('A03','T11',2,0.3);
INSERT INTO author_titles VALUES('A04','T11',3,0.3);
INSERT INTO author_titles VALUES('A06','T11',1,0.4);
INSERT INTO author_titles VALUES('A02','T12',1,1.0);
INSERT INTO author_titles VALUES('A01','T13',1,1.0);




DROP TABLE royalties;
CREATE TABLE royalties
  (
  title_id     CHAR(3)      NOT NULL,
  advance      DECIMAL(9,2)         ,
  royalty_rate DECIMAL(5,2)         ,
  CONSTRAINT royalties_pk PRIMARY KEY (title_id),
  constraint roy_Titles_fk FOREIGN KEY (title_id) REFERENCES Titles (title_id)
  );

Alter table royalties disable constraint roy_titles_fk ;

INSERT INTO royalties VALUES('T01',10000,0.05);
INSERT INTO royalties VALUES('T02',1000,0.06);
INSERT INTO royalties VALUES('T03',15000,0.07);
INSERT INTO royalties VALUES('T04',20000,0.08);
INSERT INTO royalties VALUES('T05',100000,0.09);
INSERT INTO royalties VALUES('T06',20000,0.08);
INSERT INTO royalties VALUES('T07',1000000,0.11);
INSERT INTO royalties VALUES('T08',0,0.04);
INSERT INTO royalties VALUES('T09',0,0.05);
INSERT INTO royalties VALUES('T10',NULL,NULL);
INSERT INTO royalties VALUES('T11',100000,0.07);
INSERT INTO royalties VALUES('T12',50000,0.09);
INSERT INTO royalties VALUES('T13',20000,0.06);

Alter table royalties enable constraint roy_titles_fk ;

commit;
DROP TABLE publishers;
CREATE TABLE publishers
  (
  pub_id   CHAR(3)     NOT NULL,
  pname  VARCHAR(20) NOT NULL,
  city     VARCHAR(15) NOT NULL,
  state    CHAR(2)             ,
  country  VARCHAR(15) NOT NULL,
  CONSTRAINT publishers_pk PRIMARY KEY (pub_id)
  );
INSERT INTO publishers VALUES('P01','Abatis Publishers','New York','NY','USA');
INSERT INTO publishers VALUES('P02','Core Dump Books','San Francisco','CA','USA');
INSERT INTO publishers VALUES('P03','Schadenfreude Press','Hamburg',NULL,'Germany');
INSERT INTO publishers VALUES('P04','Tenterhooks Press','Berkeley','CA','USA');

这对我来说很难:(

【问题讨论】:

  • 您的表 titles 引用了一个表 Publishers,而您没有包含 Publishers 表。
  • 我虽然不需要我现在就发布。
  • 是的,家庭作业可能很难:-)

标签: sql oracle oracle10g group-by


【解决方案1】:

让我们分步进行。以离散的步骤处理任务通常更容易。根据您的尝试,很明显您正在努力解决一些基本概念。我希望这可以帮助您学习这些概念

-- 1) First you know you are looking for authors, so select all the authors
SELECT a.au_id
  FROM authors a

-- 2) Build up all of your table joins since we know we will need data from all these tables
-- the author_titles maps authors to titles, and titles map to royalties.  Use the foreign keys provided
SELECT a.au_id
  FROM authors a
 INNER JOIN author_titles at ON a.au_id = at.au_id
 INNER JOIN titles t         ON at.title_id = t.title_id
 INNER JOIN royalties r      ON t.title_id = r.title_id

-- 3) Figure out the formula for an author's compensation
-- 3a) Notice that the royalties table has NULLs for advance and royalty_rate.  Convert these to 0
-- 3b) Notice that the titles table has NULLs for price and sales.  Convert these to 0
SELECT a.au_id
       ,total_compensation = (at.royalty_share * NVL(r.advance, 0)) + (at.royalty_share * NVL(r.royalty_rate,0) * NVL((t.price * t.sales),0))
  FROM authors a
 INNER JOIN author_titles at ON a.au_id = at.au_id
 INNER JOIN titles t         ON at.title_id = t.title_id
 INNER JOIN royalties r      ON t.title_id = r.title_id

-- 4) Summarize the compensation for each author by adding the group by author id
SELECT a.au_id
       ,total_compensation = SUM((at.royalty_share * NVL(r.advance, 0)) + (at.royalty_share * NVL(r.royalty_rate,0) * NVL((t.price * t.sales),0)))
  FROM authors a
 INNER JOIN author_titles at ON a.au_id = at.au_id
 INNER JOIN titles t         ON at.title_id = t.title_id
 INNER JOIN royalties r      ON t.title_id = r.title_id
GROUP BY a.au_id

-- 5) Find the the highest compensation.  It is the MAX of the previous query
SELECT highest_compensation = MAX(s.total_compensation)
  FROM
    (SELECT a.au_id
           ,total_compensation = SUM((at.royalty_share * NVL(r.advance, 0)) + (at.royalty_share * NVL(r.royalty_rate,0) * NVL((t.price * t.sales),0)))
      FROM authors a
     INNER JOIN author_titles at ON a.au_id = at.au_id
     INNER JOIN titles t         ON at.title_id = t.title_id
     INNER JOIN royalties r      ON t.title_id = r.title_id
     GROUP BY a.au_id) s

-- 6) Find the author(s) that match the highest compensation by combining 4) and 5)
SELECT t1.au_id
  FROM
    (SELECT a.au_id
           ,total_compensation = SUM((at.royalty_share * NVL(r.advance, 0)) + (at.royalty_share * NVL(r.royalty_rate,0) * NVL((t.price * t.sales),0)))
      FROM authors a
     INNER JOIN author_titles at ON a.au_id = at.au_id
     INNER JOIN titles t         ON at.title_id = t.title_id
     INNER JOIN royalties r      ON t.title_id = r.title_id
     GROUP BY a.au_id) t1
WHERE t1.total_compensation =
    (SELECT highest_compensation = MAX(s.total_compensation)
      FROM
        (SELECT a.au_id
               ,total_compensation = SUM((at.royalty_share * NVL(r.advance, 0)) + (at.royalty_share * NVL(r.royalty_rate,0) * NVL((t.price * t.sales),0)))
          FROM authors a
         INNER JOIN author_titles at ON a.au_id = at.au_id
         INNER JOIN titles t         ON at.title_id = t.title_id
         INNER JOIN royalties r      ON t.title_id = r.title_id
         GROUP BY a.au_id) s)

【讨论】:

  • 感谢您的快速回复。我会看这个很长时间。谢谢你的辅导。非常感谢。
  • 嘿,我得到了 1-5 WORKING,除了当我到达 6 时,查询的结果是 au_id (A04)。好像不太对,好像查询最后一个查询我觉得有问题。
  • 是什么让你认为 au_id = A04 不正确?那就是告诉你,报酬最高的作者的作者 id (au_id) 为 A04。如果你认为这是不正确的,你为什么会这样认为?
  • 因为我脑子里有多个作者拥有相同的版税份额但他们都有不同的版税率所以我会得到多个 au_id 以获得最大总补偿。你的权利,嘿嘿。史蒂文万岁!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多