[英]Proper mysql code to alter table to horizontal
我試圖讓下表看起來像這樣
當前查詢:
SELECT m.typeID, t.typeName, m.quantity, t.description
FROM invTypeMaterials AS m
LEFT JOIN invTypes AS t
ON m.materialTypeID = t.typeID
LEFT JOIN invTypes
ON m.TypeID = t.typeID
WHERE m.typeID = 10039
當前結果
typeID typeName quantity description
10039 Tritanium 71 The main building block in space structures. A ver...
10039 Pyerite 24 A soft crystal-like mineral with a very distinguis...
10039 Mexallon 1 Very flexible metallic mineral, dull to bright sil...
我正在尋找的是它像這樣顯示
typeID Tritanium Pyerite mexallon description
10039 71 24 1 Doesn't matter
我嘗試過左連接、外連接、內連接等的組合,但無法使其工作。 我也嘗試過 group_concat,我認為這是我需要的,但無法正確設置列
謝謝
編輯:通過使用以下內容,我使該列看起來像我想要的:
SELECT m1.typeID,
SUM(CASE WHEN m1.materialTypeID = 34 THEN m1.quantity ELSE 0 END) AS Tritanium,
SUM(CASE WHEN m1.materialTypeID = 35 THEN m1.quantity ELSE 0 END) AS Pyerite,
SUM(CASE WHEN m1.materialTypeID = 36 THEN m1.quantity ELSE 0 END) AS Mexallon,
SUM(CASE WHEN m1.materialTypeID = 37 THEN m1.quantity ELSE 0 END) AS Isogen,
SUM(CASE WHEN m1.materialTypeID = 38 THEN m1.quantity ELSE 0 END) AS Nocxium,
SUM(CASE WHEN m1.materialTypeID = 39 THEN m1.quantity ELSE 0 END) AS Zydrine,
SUM(CASE WHEN m1.materialTypeID = 40 THEN m1.quantity ELSE 0 END) AS Megacyte,
SUM(CASE WHEN m1.materialTypeID = 11399 THEN m1.quantity ELSE 0 END) AS Morphite
FROM invTypeMaterials AS m1
WHERE m1.typeID = 10039
結果:
typeID Tritanium Pyerite Mexallon Isogen Nocxium Zydrine Megacyte Morphite
10039 71 24 1 0 0 0 0 0
當我取出“WHERE”子句並嘗試將它們全部拉出時,它顯示如下:
typeID Tritanium Pyerite Mexallon Isogen Nocxium Zydrine Megacyte Morphite
18 13989190531 1301687143 261706229 54807927 14277967 4262960 1540121 40701
有任何想法嗎?
更新 2:我明白了,GROUP BY 成功了
假設typeName
值始終相同,您可以在查詢的選擇部分使用子查詢來獲取所需的值。
$sql = "SELECT m.typeID,
(SELECT m.quantity FROM invTypes AS t WHERE m.materialTypeID = t.typeID AND t.typeName = 'Tritanium') as Tritanium,
(SELECT m.quantity FROM invTypes AS t WHERE m.materialTypeID = t.typeID AND t.typeName = 'Pyerite') as Pyerite,
(SELECT m.quantity FROM invTypes AS t WHERE m.materialTypeID = t.typeID AND t.typeName = 'Mexallon') as Mexallon
FROM invTypeMaterials AS m
WHERE m.typeID = 10039";
我認為 SQL 中沒有任何方法可以生成動態列。 如果您可以編寫動態 SQL,那么可以,但是在純 SQL 中,我不這么認為。
如果您願意對列進行硬編碼,那么您可以這樣做
SELECT
m.TypeID,
MAX(CASE
WHEN t.typeName = 'Tritanium' THEN m.quantity
ELSE 0
END) Tritanium,
MAX(CASE
WHEN t.typeName = 'Pyerite' THEN m.quantity
ELSE 0
END) Pyerite,
MAX(CASE
WHEN t.typeName = 'Mexallon' THEN m.quantity
ELSE 0
END) Mexallon
FROM
[your FROM clause]
WHERE
[your WHERE clause]
GROUP BY
m.TypeID;
We have pivot clause in oracle to do similar kind of functionality.
It helps in writing cross tabulation query i.e., we can aggregate results and rotate rows into columns.
tried the below with some sample data:
create table types(typeid number,typename varchar2(20),
quantity number);
insert into types values(1,'xx',11);
insert into types values(1,'yy',121);
insert into types values(1,'zz',113);
delete from types where typeid in(2,3);
select *from
(select typeid,typename,quantity from types)
pivot
(
sum(quantity)
for typename in('xx','yy','zz')
)
typeid xx yy zz
1 11 121 113
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.