そのため、私はMySQLの学習をいくつかの演習で始めたばかりで、現在これら2つの問題に行き詰っています。これは技術的には演習であるため、完全なソリューションではなくヒントを本当に感謝します。最初に2つのテーブルがあります。
CREATE TABLE LINE (
INV_NUMBER int,
LINE_NUMBER int,
P_CODE varchar(10),
LINE_UNITS float(8),
LINE_PRICE float(8),
LINE_TOTAL float(8)
);
INSERT INTO LINE VALUES('1001','1','13-Q2/P2','1','14.99','14.99');
INSERT INTO LINE VALUES('1001','2','23109-HB','1','9.95','9.95');
INSERT INTO LINE VALUES('1002','1','54778-2T','2','4.99','9.98');
INSERT INTO LINE VALUES('1003','1','2238/QPD','1','38.95','38.95');
INSERT INTO LINE VALUES('1003','2','1546-QQ2','1','39.95','39.95');
INSERT INTO LINE VALUES('1003','3','13-Q2/P2','5','14.99','74.95');
INSERT INTO LINE VALUES('1004','1','54778-2T','3','4.99','14.97');
INSERT INTO LINE VALUES('1004','2','23109-HB','2','9.95','19.90');
INSERT INTO LINE VALUES('1005','1','PVC23DRT','12','5.87','70.44');
INSERT INTO LINE VALUES('1006','1','SM-18277','3','6.99','20.97');
INSERT INTO LINE VALUES('1006','2','2232/QTY','1','109.92','109.92');
INSERT INTO LINE VALUES('1006','3','23109-HB','1','9.95','9.95');
INSERT INTO LINE VALUES('1006','4','89-WRE-Q','1','256.99','256.99');
INSERT INTO LINE VALUES('1007','1','13-Q2/P2','2','14.99','29.98');
INSERT INTO LINE VALUES('1007','2','54778-2T','1','4.99','4.99');
INSERT INTO LINE VALUES('1008','1','PVC23DRT','5','5.87','29.35');
INSERT INTO LINE VALUES('1008','2','WR3/TT3','3','119.95','359.85');
INSERT INTO LINE VALUES('1008','3','23109-HB','1','9.95','9.95');
CREATE TABLE PRODUCT (
P_CODE varchar(10),
P_DESCRIPT varchar(35),
P_INDATE date,
P_QOH int,
P_MIN int,
P_PRICE float(8),
P_DISCOUNT float(8),
V_CODE int
);
INSERT INTO PRODUCT VALUES('11QER/31','Power Painter, 15 psi., 3-
Nozzle','2015-11-03','8','5','109.99','0','25595');
INSERT INTO PRODUCT VALUES('13-Q2/P2','7.25-in. pwr. saw blade','2015-12-
13','32','15','14.99','0.05',NULL);
INSERT INTO PRODUCT VALUES('14-Q1/L3','9.00-in. pwr. saw blade','2015-11-
13','18','12','17.49','0','21344');
INSERT INTO PRODUCT VALUES('1546-QQ2','Hrd. cloth, 1/4-in., 2x50','2016-01-
15','15','8','39.95','0','23119');
INSERT INTO PRODUCT VALUES('1558-QW1','Hrd. cloth, 1/2-in., 3x50','2016-01-
15','23','5','43.99','0','23119');
INSERT INTO PRODUCT VALUES('2232/QTY','B&D jigsaw, 12-in. blade','2015-12-
30','8','5','109.92','0.05','24288');
INSERT INTO PRODUCT VALUES('2232/QWE','B&D jigsaw, 8-in. blade','2015-12-
24','6','5','99.87','0.05','24288');
INSERT INTO PRODUCT VALUES('2238/QPD','B&D cordless drill, 1/2-in.','2016-
01-20','12','5','38.95','0.05','25595');
INSERT INTO PRODUCT VALUES('23109-HB','Claw hammer','2016-01-
12','23','10','9.95','0.1','21225');
INSERT INTO PRODUCT VALUES('23114-AA','Sledge hammer, 12 lb.','2016-01-
2','8','5','14.40','0.05',NULL);
INSERT INTO PRODUCT VALUES('54778-2T','Rat-tail file, 1/8-in. fine','2015-
12-15','43','20','4.99','0','21344');
INSERT INTO PRODUCT VALUES('89-WRE-Q','Hicut chain saw, 16 in.','2016-02-
17','11','5','256.99','0.05','24288');
INSERT INTO PRODUCT VALUES('PVC23DRT','PVC pipe, 3.5-in., 8-ft','2016-02-
27','188','75','5.87','0','24004');
INSERT INTO PRODUCT VALUES('SM-18277','1.25-in. metal screw, ''25','2016-03-
01','172','75','6.99','0','21225');
INSERT INTO PRODUCT VALUES('SW-23116','2.5-in. wd. screw, 50','2016-02-
14','237','100','8.45','0','21231');
INSERT INTO PRODUCT VALUES('WR3/TT3','Steel matting, 4''x8''x1/6", .5"
mesh','2016-01-27','18','5','119.95','0.1','25595');
PKsはline.INV_NUMBER、line.LINE_NUMBER、product.P_CODEおよびFKsはline.P_CODEおよびline.V_CODEです=
したがって、最初の質問は、その製品の平均販売数を超えるすべての製品販売をリストし、相関インラインクエリを追加して、製品あたりの平均販売数をリストすることです。私が正しく理解している場合、これはline.LINE_UNITSグループをP_CODEで合計する必要があることを意味し、それを平均販売数と比較しますが、サブクエリが複数の行を返すという同じエラーが発生し続けます。これが私のコードです:
select P_CODE,
LINE_UNITS,
( SELECT AVG(line.LINE_UNITS) ) as ‘Unit_Average’
from line
where
( SELECT sum(line.LINE_UNITS)
from line
group by P_CODE ) >
( SELECT AVG(line.LINE_UNITS) );
代わりに結合を行う必要があると思います。いくつかのヒントに本当に感謝します。
2番目の質問については、各製品の価格と平均製品価格の違いをリストすることになっています。数行入力できましたが、productテーブルのすべての行に対して実行できませんでした。私はover()の使用を考えていますが、かなりの構文エラーがあります。これが私のコードです:
select P_CODE, P_PRICE,
( SELECT avg(product.P_PRICE) ) as 'Average',
if(product.P_PRICE <=
( SELECT avg(product.P_PRICE) ),
( SELECT avg(product.P_PRICE) ) - product.P_PRICE,
product.P_PRICE - ( SELECT avg(product.P_PRICE) )
) as 'Difference'
from product;
みんなありがとう!
あなたの最初の質問について、私は各製品の平均が何であるかを理解することから始めます:
select p_code, avg(line_units) as line_units
from LINE
group by p_code;
SQLは、クエリのすべての結果がテーブルであるという意味で閉じているため、通常のテーブルと同じように結果を使用できます。つまり、このクエリを元のテーブルと結合できます。
select l.*
from LINE as l
join (
select p_code, avg(line_units) as line_units
from LINE
group by p_code
) as avg_l
on l.p_code = avg_l.p_code
and l.line_units > avg_l.line_units;
MySQLの最新バージョンは、SQL99のウィンドウ関数を実装し、少し簡単になりました(テストされていません)
select INV_NUMBER, LINE_NUMBER, P_CODE, LINE_UNITS
, LINE_PRICE, LINE_TOTAL
from (
select INV_NUMBER, LINE_NUMBER, P_CODE, LINE_UNITS
, LINE_PRICE, LINE_TOTAL
, AVG(LINE_UNITS) OVER (PARTITION BY P_CODE) AS AVG_LINE_UNITS
from line
) AS T
WHERE LINE_UNITS > AVG_LINE_UNITS
上記の手法のいずれかを使用して質問2を解決できるはずです。問題が発生した場合はお知らせください
ヒント:
どちらが大きいかに応じて、product.P_PRICE - ( SELECT avg(product.P_PRICE) )
が何を提供するかを考えます。
お金や整数値( "単位")にFLOAT
を使用しないでください。
すべての引用が等しいわけではありません。
WHERE
では集計関数を使用できませんが、HAVING
では使用できます。
列の前にテーブルの名前を付けるのは煩雑です。 JOIN
を使用している場合は、わかりやすくするためにエイリアスを使用できます(使用する必要があります)。_SELECT p.price, ... JOIN Products AS p
_
SELECT
には通常FROM
が必要です。
SELECT @avg_price := avg(p.PRICE) FROM products AS p
で何ができるかを別のステートメントとして考えてください。