簡體   English   中英

MySQL的樞軸使用列和行號

[英]mysql pivot using column and row numbers

我被困在這種情況下,我需要使用表列的行號和列號值來導出下面提到的輸出。 我已經嘗試了一切-如果/其他情況下,何時/然后,但沒有幫助。

任何幫助/建議都非常感謝!

這是db表中存在的模擬樣本數據-

+--------+--------+--------+----------+-------------+ 
| Record | ColNbr | RowNbr | ColTitle | CellContent | 
+--------+--------+--------+----------+-------------+
|      1 | 1      | 1      | Unit     | sqf         |
|      1 | 1      | 2      | Unit     | cm          |
|      1 | 2      | 1      | Desc     | roof        |
|      1 | 2      | 2      | Desc     | rod         |
|      1 | 3      | 1      | Material | concrete    |
|      1 | 3      | 2      | Material | steel       |
|      1 | 4      | 1      | Quantity | 100         |
|      1 | 4      | 2      | Quantity | 12          |
|      1 | 1      | 1      | Unit     | liter       |
|      1 | 1      | 2      | Unit     | ml          |
|      1 | 2      | 1      | Desc     | bowl        |
|      1 | 2      | 2      | Desc     | plate       |
|      1 | 3      | 1      | Material | plastic     |
|      1 | 3      | 2      | Material | glass       |
|      1 | 4      | 1      | Quantity | 2           |
|      1 | 4      | 2      | Quantity | 250         |
+--------+--------+--------+----------+-------------+

預期產出-

+--------+--------+--------+----------+-------------+ 
| Record | Unit   | Desc   | Material | Quantity    | 
+--------+--------+--------+----------+-------------+
|      1 | sqf    | roof   | concrete | 100         |
|      1 | cm     | rod    | steel    | 12          |
|      2 | liter  | bowl   | plastic  | 2           |
|      2 | ml     | plate  | glass    | 250         |
+--------+--------+--------+----------+-------------+

如果您的實際數據是這樣,我建議您考慮將數據分離到; 例如,有4個不同的表格(單位,說明,物料和一個用於存儲所有ID +數量的表格)。 前3個表將存儲先決條件信息,這些信息將在整個時間內進行較小的更新,而最后一個表將存儲所有數量記錄。 假設您的表格如下所示:

CREATE TABLE `Unit` (
unit_id INT,
unit_name VARCHAR(50));

+---------+-----------+
| unit_id | unit_name |
+---------+-----------+
|    1    | sqf       |
|    2    | cm        |
|    3    | liter     |
|    4    | ml        |
+---------+-----------+

CREATE TABLE `Description` (
desc_id INT,
desc_name VARCHAR(50));

+---------+-----------+
| desc_id | desc_name |
+---------+-----------+
|    1    | roof      |
|    2    | rod       |
|    3    | bowl      |
|    4    | plate     |
+---------+-----------+

CREATE TABLE `Material` (
mat_id INT,
mat_name VARCHAR(50));

+--------+----------+
| mat_id | mat_name |
+--------+----------+
|    1   | concrete |
|    2   | steel    |
|    3   | plastic  |
|    4   | glass    |
+--------+----------+

CREATE TABLE `Records` (
unit_id INT,
desc_id INT,
mat_id INT,
quantity DECIMAL(14,4));

+---------+---------+--------+----------+ 
| unit_id | desc_id | mat_id | Quantity | 
+---------+---------+--------+----------+
|    1    |    1    |    1   | 100      |
|    2    |    2    |    2   | 12       |
|    3    |    3    |    3   | 2        |
|    4    |    4    |    4   | 250      |
+---------+---------+--------+----------+

然后,您相應地插入數據。

無論如何,對於您現有的數據示例,可以完成此操作,但是對於單位+說明+材料+數量匹配是否正確存在一些擔憂。 我可能至少認為它正確匹配的唯一方法是為所有查詢提供相似的ORDER BY子句。 因此,以下內容:

SELECT A.record,A.unit,B.Desc,C.Material,D.Quantity FROM
     (SELECT @rn:=@rn+1 AS record,CASE WHEN coltitle='unit' THEN cellcontent END AS Unit 
        FROM yourtable, (SELECT @rn :=0 ) v 
      HAVING unit IS NOT NULL
      ORDER BY colnbr) A LEFT JOIN
     (SELECT @rn1:=@rn1+1 AS record,CASE WHEN coltitle='Desc' THEN cellcontent END AS `Desc`
        FROM yourtable, (SELECT @rn1 :=0 ) v 
      HAVING `Desc` IS NOT NULL
      ORDER BY colnbr) B ON a.record=b.record LEFT JOIN 
     (SELECT @rn2:=@rn2+1 AS record,CASE WHEN coltitle='material' THEN cellcontent END AS Material 
        FROM yourtable, (SELECT @rn2:=0 ) v 
      HAVING Material IS NOT NULL
      ORDER BY colnbr) C ON a.record=c.record LEFT JOIN 
     (SELECT @rn3:=@rn3+1 AS record,CASE WHEN coltitle='Quantity' THEN cellcontent END AS Quantity 
        FROM yourtable, (SELECT @rn3:=0 ) v 
      HAVING Quantity IS NOT NULL
      ORDER BY colnbr) D ON a.record=d.record;

這里的想法是基於COLTITLE創建一個子查詢,然后為每個子查詢分配一個編號/排名( @rn,@rn1,@rn2,@rn3 )變量,然后使用LEFT JOIN將它們LEFT JOIN 現在,此實驗可以准確返回所需的輸出,但它不是一個確定的答案,因為有些部分存在問題,尤其是在正確匹配組合時。 希望這會給您一些想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM