簡體   English   中英

MySQL查詢,數據透視表

[英]MySQL Query, Pivoting Table

我在建立將我的行旋轉為列的查詢時遇到了麻煩。 我的數據透視表是我的DATE。 用戶需要的是查看整周的數據。

我的數據是這樣構造的:

ID - AssemblyDate
----------------------------------
12345 - 2015-01-01
12346 - 2015-01-01
12347 - 2015-01-01
12348 - 2015-01-02
12349 - 2015-01-02
12350 - 2015-01-02
12351 - 2015-01-03
12352 - 2015-01-03
12353 - 2015-01-03

我期望的結果將是這樣的

DAY1 - DAY2 - DAY3
12345  12348  12351
12346  12349  12352
12347  12350  12352

我嘗試過的東西:

SELECT CASE WHEN (AssemblyDate = '2015-01-01') THEN ID ELSE NULL END AS DAY1
       , CASE WHEN (AssemblyDate = '2015-01-02') THEN ID ELSE NULL END AS DAY2
       , CASE WHEN (AssemblyDate = '2015-01-03') THEN ID ELSE NULL END AS DAY3
FROM MyTable
GROUP BY AssemblyDate

這給了我這樣的東西:

DAY1 - DAY2 - DAY3
12345  NULL   NULL
12346  NULL   NULL
12347  NULL   NULL
NULL   12348  NULL
NULL   12349  NULL
NULL   12350  NULL
NULL   NULL   12351
NULL   NULL   12352
NULL   NULL   12352

但是我不想要空值...有沒有一種方法可以讓我將它們設為空值?

您需要做些擺弄,因為您需要進一步將這些結果分組。 由於沒有什么可分組的,因此我們需要設計一些用於分組的東西-在這種情況下,每列一個變量,只要該列與裝配日期匹配,我們就會增加該變量:

select if(assemblydate = '2015-01-01', @d1c := @d1c +1, 
          if(assemblydate = '2015-01-02', @d2c := @d2c + 1, @d3c := @d3c +1)) id,  
       case when assemblydate = '2015-01-01' then id end d1,   
       case when assemblydate = '2015-01-02' then id end d2,   
       case when assemblydate = '2015-01-03' then id end d3  
  from d, (select @d1c := 0, @d2c := 0, @d3c := 0) q;

該查詢僅添加一個id列,該列每天遞增,結果如下所示。

+------+-------+-------+-------+
| id   | d1    | d2    | d3    |
+------+-------+-------+-------+
|    1 | 12345 |  NULL |  NULL |
|    2 | 12346 |  NULL |  NULL |
|    3 | 12347 |  NULL |  NULL |
|    1 |  NULL | 12348 |  NULL |
|    2 |  NULL | 12349 |  NULL |
|    3 |  NULL | 12350 |  NULL |
|    1 |  NULL |  NULL | 12351 |
|    2 |  NULL |  NULL | 12352 |
|    3 |  NULL |  NULL | 12352 |
+------+-------+-------+-------+

完成后,我們只需要對結果進行另一個查詢,將ID分組即可,並使用max()不為null的值

select max(d1), max(d2), max(d3) from
(
  select if(assemblydate = '2015-01-01', @d1c := @d1c +1, 
          if(assemblydate = '2015-01-02', @d2c := @d2c + 1, @d3c := @d3c +1)) id,  
       case when assemblydate = '2015-01-01' then id end d1,   
       case when assemblydate = '2015-01-02' then id end d2,   
       case when assemblydate = '2015-01-03' then id end d3  
  from d, (select @d1c := 0, @d2c := 0, @d3c := 0) q
) qq
group by id;

在這里擺弄

暫無
暫無

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

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