我需要檢索唯一但被截斷的部件號,并有條件地確定它們的描述值。
資料:
這是一些簡化的示例資料:(
真實表有一百萬行)
create table inventory(
partnumber VARCHAR(10),
description VARCHAR(10)
);
INSERT INTO inventory (partnumber,description) VALUES
('12345','ABCDE'),
('123456','ABCDEF'),
('1234567','ABCDEFG'),
('98765','ZYXWV'),
('987654','ZYXWVU'),
('9876543','ZYXWVUT'),
('abcde',''),
('abcdef','123'),
('abcdefg','321'),
('zyxwv',NULL),
('zyxwvu','987'),
('zyxwvut','789');
嘗試:
我嘗試了太多的東西,無法在此列出。
我終于找到了一種方法來克服所有“未知欄位”錯誤并至少得到一些結果,但是:
- 這是超級笨拙!
- 我的結果不僅限于 unique
prods。
這是我當前的查詢:
SELECT
LEFT(i.partnumber, 6) AS prod,
CASE
WHEN agg.cnt > 1
OR i.description IS NULL
OR i.description = ''
THEN LEFT(i.partnumber, 6)
ELSE i.description
END AS `descrip`
FROM inventory i
INNER JOIN (SELECT LEFT(ii.partnumber, 6) t, COUNT(*) cnt
FROM inventory ii GROUP BY ii.partnumber) AS agg
ON LEFT(i.partnumber, 6) = agg.t;
目標:
我的目標是檢索:
| 產品 | 描述 |
|---|---|
| 12345 | ABCDE |
| 123456 | 123456 |
| 98765 | ZYXWV |
| 987654 | 987654 |
| abcde | abcde |
| abcdef | abcdef |
| 知乎 | 知乎 |
| 知乎 | 知乎 |
問題:
- 使用
COUNT()具有CASE條件型別的聚合資料有哪些更簡潔的方法? - 如何限制我的結果,以便所有
prods 都是唯一的?
uj5u.com熱心網友回復:
您可以通過檢查 if 來檢查 aleft(partnumber, 6)在結果中是否不唯一count(*) > 1。在這種情況下讓descrip是left(partnumber, 6)。否則,您可以使用max(description)(或min(description)) 來獲取單個描述,但滿足對不在GROUP BY. 用來替換空的或NULL描述,nullif()并且coalesce()可以使用。
這將導致僅使用一層聚合而沒有連接的以下結果:
SELECT left(partnumber, 6) AS prod,
CASE
WHEN count(*) > 1 THEN
left(partnumber, 6)
ELSE
coalesce(nullif(max(description), ''), left(partnumber, 6))
END AS descrip
FROM inventory
GROUP BY left(partnumber, 6)
ORDER BY left(partnumber, 6);
但是在 MySQL 中似乎有一個錯誤并且這個查詢失敗了。引擎不會“看到”,在串列中 afterSELECT partnumber僅用于運算式中left(partnumber, 6),該運算式也在GROUP BY. 相反,引擎錯誤地抱怨partnumber不在GROUP BY聚合函式中并且不受聚合函式的約束。
作為一種解決方法,我們可以使用派生表,將其縮短為partnumber前六個字符。然后我們使用派生表的那一列而不是left(partnumber, 6).
SELECT l6pn AS prod,
CASE
WHEN count(*) > 1 THEN
l6pn
ELSE
coalesce(nullif(max(description), ''), l6pn)
END AS descrip
FROM (SELECT left(partnumber, 6) AS l6pn,
description
FROM inventory) AS x
GROUP BY l6pn
ORDER BY l6pn;
或者我們在第一個之外的其他人max()周圍貼上一些實際上毫無意義的es left(partnumber, 6),以解決該錯誤。
SELECT left(partnumber, 6) AS prod,
CASE
WHEN count(*) > 1 THEN
max(left(partnumber, 6))
ELSE
coalesce(nullif(max(description), ''), max(left(partnumber, 6)))
END AS descrip
FROM inventory
GROUP BY left(partnumber, 6)
ORDER BY left(partnumber, 6);
db<>fiddle(將 DBMS 更改為其他類似 Postgres 或 MariaDB 以查看它們是否也接受第一個查詢。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/396738.html
