2017-09-25 54 views
3

我現在有一個表,其中顯示我需要的MySQL的列標題到一個列中,第二列中的值

SELECT * FROM XYZ;

Date | Brand | Game1| Game2 | Game3 | 
2017 | xxxxx | xxxxxx | ---------- | -----------| 

2017 | xxxxx | ----------| yyyyyyy | -----------| 

2017 | xxxxx | ----------| -----------| yyyyyyy | 

我想的數據的方式的格式數據提出與4列總,是這樣的:

Date | Brand | GameName | Value 

2017 | xxxxx | Game1 | 1234567.89 

2017 | xxxxx | Game2 | 98.7654321 

2017 | xxxxx | Game3 | 12345987.65 

這樣做的原因是這樣的數據變得更容易通過篩選查找特定的值。

我試過在SO大多數其他的建議,但並沒有做出什麼成績來

(如group_concat)。

一個建議做的工作是做所有的聯盟,但是我需要一個動態查詢 ,因爲這個表將在未來繼續添加。

目前我試圖設置一個遊標來做到這一點。

+0

是什麼所有這些破折號?他們真的是破折號還是別的什麼,例如空字符串還是null? –

+0

在表中他們只是0的 – davo777

+0

在這個問題有人問了類似的問題。這裏的關鍵字是「transponding」或「unpivot」。 https:// stackoverflow。com/questions/31238717/unpivot-dynamic-columns-to-rows-missing-data-from-last-columns –

回答

1

如果您的表將保持有那麼新列取其查詢你使用,你必須首先從INFORMATION_SCHEMA.TABLE得到所有的列,這裏是一個辦法:

  • 獲取所有的列名與%Game%模式
  • 使用UNION或其他任何的查詢來獲得輸出

下面是一個例子:

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='db_name' 
    AND `TABLE_NAME`='table' 
    AND COLUMN_NAME LIKE '%Game%'; 

現在,從這個查詢的輸出,構建一個動態UNION查詢,例如:

SELECT Date, Brand, `<column>`, Value 
FROM table 

UNION 

SELECT Date, Brand, `<column>`, Value 
FROM table 
+0

如果沒有什麼東西可以加入到我的最終表中,我該如何獲得''? – davo777

+0

您將迭代第一個查詢的結果集併爲最終結果創建聯合查詢。 ''只是第一個查詢中的一行值。 –

1

你可以做一個逆轉置與聚合生成你想要的輸出組合。感謝您爲每個遊戲計算的價值與相應遊戲欄的總和一致。這是因爲你說所有其他值都是零。

SELECT 
    Date, 
    MAX(CASE WHEN Game1 <> 0 THEN Brand END) AS Brand, 
    'Game1' AS GameName, 
    SUM(Game1) AS Value 
FROM yourTable 
GROUP BY Date 
UNION ALL 
SELECT 
    Date, MAX(CASE WHEN Game2 <> 0 THEN Brand END), 'Game2', SUM(Game2) 
FROM yourTable 
GROUP BY Date 
UNION ALL 
SELECT 
    Date, MAX(CASE WHEN Game3 <> 0 THEN Brand END), 'Game3', SUM(Game3) 
FROM yourTable 
GROUP BY Date 

演示在這裏:

Rextester

1

這應該工作

select Date, Brand, 'Game1', Game1 where Game1 is not null 
UNION ALL 
select Date, Brand, 'Game2' Game2 where Game2 is not null 
UNION ALL 
select Date, Brand, 'Game3' Game3 where Game3 is not null 

您可以將此保存爲視圖,並直接查詢它的結果

+0

MySQL不支持CTE,但無論如何,您的數據與問題q.v中的數據不匹配。以上評論。 –

+0

在這種情況下,我將刪除cte和重構數據 – jidexl21

+0

這將工作,但問題是,我需要一個動態查詢 – davo777

相關問題