[英]Multi-row, instead of single row data transformation with trigger in MYSQL
[英]MySQL - multi-row by 1 id & converting multi-column data into a comma delimited row
我有一個數據庫表:
分隔每個請求的請求者ID列(需要)
類別ID列,可將請求中的每個項目(類別)分為不同的類別
一個商品ID列,用於分隔類別(itemid)中的每個商品類型
列出項目名稱(項目)的項目名稱列
提供項目描述的項目描述符列(desc)
和金額列,給出該類別中每個項目的總費用(金額)
所以我的桌子看起來像這樣:
|---------|-------|----------|--------|-------|------------|
| reqid | catid | itemid | item | desc | amount |
|---------|-------|----------|--------|-------|------------|
| 1 | 3 | 16 | food | food | 200 |
|---------|-------|----------|--------|-------|------------|
| 1 | 3 | 17 | water | wtr | 50 |
|---------|-------|----------|--------|-------|------------|
| 1 | 3 | 18 | film | film | 20 |
|---------|-------|----------|--------|-------|------------|
| 1 | 5 | 30 | room | room | 500 |
|---------|-------|----------|--------|-------|------------|
| 1 | 5 | 31 | chair | chair | 150 |
|---------|-------|----------|--------|-------|------------|
| 2 | 3 | 16 | food | food | 200 |
|---------|-------|----------|--------|-------|------------|
| 2 | 3 | 17 | water | wtr | 50 |
|---------|-------|----------|--------|-------|------------|
| 3 | 3 | 18 | film | film | 20 |
|---------|-------|----------|--------|-------|------------|
| 3 | 5 | 30 | room | room | 500 |
|---------|-------|----------|--------|-------|------------|
| 3 | 5 | 31 | chair | chair | 150 |
|---------|-------|----------|--------|-------|------------|
我希望我的查詢結果看起來像
|--------|------------------|----------------------|--------------------|--------------------|
| reqid | catid3itemid | catid3item | catid3desc | catid3amount |
|--------|------------------|----------------------|--------------------|--------------------|
| 1 |16, 17, 18 | food, water, film | food, wtr, film | 200, 50, 20 |
|--------|------------------|----------------------|--------------------|--------------------|
| 2 |16, 17 | food, water |food, wtr | 200, 50, |
|--------|------------------|----------------------|--------------------|--------------------|
| 3 |18 | film | film | 20 |
|--------|------------------|----------------------|--------------------|--------------------|
繼續:
|------------------|----------------------|--------------------|--------------------|
| catid4itemid | catid4item | catid4desc | catid4amount |
|------------------|----------------------|--------------------|--------------------|
| | | | |
|------------------|----------------------|--------------------|--------------------|
| | | | |
|------------------|----------------------|--------------------|--------------------|
| | | | |
|------------------|----------------------|--------------------|--------------------|
繼續決賽:
|------------------|----------------------|--------------------|--------------------|
| catid5itemid | catid5item | catid5desc | catid5amount |
|------------------|----------------------|--------------------|--------------------|
|30,31 |room, chair |room, chair | 500, 150 |
|------------------|----------------------|--------------------|--------------------|
| | | | |
|------------------|----------------------|--------------------|--------------------|
|30,31 |room, chair |room, chair | 500, 150 |
|------------------|----------------------|--------------------|--------------------|
我一直在看有關使用GROUP_CONCAT或CROSS APPLY或SWITCH STATEMENT的帖子
例如GROUP_CONCAT:
select *, GROUP_CONCAT(`table`.`categoryid` ORDER BY `table`.`categoryid` ASC SEPARATOR ', ') AS `categoryid`
from `table`
GROUP BY `table`.`requestid`
但這會將所有內容集中到一列,而不是由類別ID分隔,而是將所有類別ID合並到一列中。
任何建議或幫助將不勝感激。
謝謝大家的幫助! 我沒有使用數據透視表就知道了
選擇table
。 requestid
AS request_id
,GROUP_CONCAT((情況下( table
。 categoryid
= 2),那么table
。 item
端)分離器”, ')AS item2
,GROUP_CONCAT((情況下( table
。 categoryid
= 2),那么table
。 descriptor
端)分隔符' , ')AS descriptor2
,GROUP_CONCAT((情況下( table
。 categoryid
= 2),那么table
。 amount
端)分離器',“)AS amount2
,GROUP_CONCAT((情況下( table
。 categoryid
= 3),那么table
。 item
端)分離器' ')AS item3
,GROUP_CONCAT((情況下( table
。 categoryid
= 3),那么table
。 descriptor
端)分離器',')AS descriptor3
,GROUP_CONCAT((情況下( table
。 categoryid
= 3),那么table
。 amount
端)分離器' ')AS amount3
GROUP_CONCAT((情況下( table
。 categoryid
= 4),那么table
。 item
端)分離器',')AS item4
,GROUP_CONCAT((情況下( table
。 categoryid
= 4),那么table
。 descriptor
端)分離器' ')AS descriptor4
,GROUP_CONCAT((情況下( table
。 categoryid
= 4),那么table
。 amount
端)分離器',')AS amount4
GROUP_CONCAT((情況下( table
。 categoryid
categoryid
= 5)然后是table
。 item
端)分離器' ')AS item5
,GROUP_CONCAT((情況下( table
。 categoryid
= 5),則table
。 descriptor
端)分離器',')AS descriptor5
,GROUP_CONCAT((情況下( table
。 categoryid
= 5),然后table
。 amount
端)分離器'')AS amount5
從table
其中(( table
。 categoryid
= 2)或( table
。 categoryid
= 3)或( table
。 categoryid
= 4)或( table
。 categoryid
= 5))
按table
分組。 requestid
如果類別是固定的(3、4和5),則可以使用以下查詢:
select
reqid,
group_concat(distinct if(catid = 3, itemid, null)) as catid3itemid,
group_concat(distinct if(catid = 3, item, null)) as catid3item,
group_concat(distinct if(catid = 3, `desc`, null)) as catid3desc,
group_concat(distinct if(catid = 3, amount, null)) as catid3amount ,
group_concat(distinct if(catid = 4, itemid, null)) as catid4itemid,
group_concat(distinct if(catid = 4, item, null)) as catid4item,
group_concat(distinct if(catid = 4, `desc`, null)) as catid4desc,
group_concat(distinct if(catid = 4, amount, null)) as catid4amount ,
group_concat(distinct if(catid = 5, itemid, null)) as catid5itemid,
group_concat(distinct if(catid = 5, item, null)) as catid5item,
group_concat(distinct if(catid = 5, `desc`, null)) as catid5desc,
group_concat(distinct if(catid = 5, amount, null)) as catid5amount
from tab
group by reqid;
如果必須是動態的,則可以使用過程。 下面,我使用了重復結構來生成查詢,該查詢返回每個catid
所需的結構(最小到最大)並使用准備好的語句執行它:
-- only to avoid problem with only_full_group_by
set global sql_mode = "";
create table tab (reqid int, catid int, itemid int, item varchar(10), `desc` varchar(20), amount int);
insert into tab values
(1, 3, 16, 'food', 'food', 200),
(1, 3, 17, 'water', 'wtr', 50),
(1, 3, 18, 'film', 'film', 20),
(1, 5, 30, 'room', 'room', 500),
(1, 5, 31, 'chair', 'chair', 150),
(2, 3, 16, 'food', 'food', 200),
(2, 3, 17, 'water', 'wtr', 50),
(3, 3, 18, 'film', 'film', 20),
(3, 5, 30, 'room', 'room', 500),
(3, 5, 31, 'chair', 'chair', 150);
delimiter $$
CREATE PROCEDURE result()
BEGIN
DECLARE i INT DEFAULT (select min(catid) from tab);
DECLARE iEnd INT DEFAULT (select max(catid) from tab);
SET @sQuery = 'select reqid';
WHILE i <= iEnd DO
set @sQuery = CONCAT(@sQuery,
', group_concat(distinct if(catid = ',i,', itemid, null)) as catid',i,'itemid,
group_concat(distinct if(catid = ',i,', item, null)) as catid',i,'item,
group_concat(distinct if(catid = ',i,', `desc`, null)) as catid',i,'desc,
group_concat(distinct if(catid = ',i,', amount, null)) as catid',i,'amount'
);
SET i = i + 1;
END WHILE;
SET @sQuery = CONCAT(@sQuery, ' from tab group by reqid');
PREPARE stmt FROM @sQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
call result();
注意:因為您沒有提供太多詳細信息,而且正如注釋中所述,所以最好在應用程序中執行顯示邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.