2013-01-25 63 views
1

我有以下查询,工作100%。mysql查询输出行到列

SELECT 
transporttype, 
concat(MONTHNAME(STR_TO_DATE(month, '%m')), ' ', year) AS `month`, 
round(sum(cost),0) AS cost 
FROM v2ReportingTable 
WHERE (transporttype not in ('Extrusions-LongDistance','Extrusions-Shuttle') and urgent='no') 
GROUP BY (concat(MONTHNAME(STR_TO_DATE(month, '%m')),' ',year)),transporttype 
ORDER BY (concat(MONTHNAME(STR_TO_DATE(month, '%m')),' ',year)), transporttype 

此输出在低于1列的结果:

enter image description here

如何操作查询,以便输出为列,所以我可以绘制它。所需的输出是这样的:

enter image description here

帮助表示赞赏一如既往,

更新到可能的答案,从奥斯卡·佩雷斯

enter image description here

+0

这里没有什么可看的......'1列如下:'和'output is like'? – Sahal

+0

这是您查询的PIVOT表。 [这是一个很好的解释。](http://www.artfulsoftware.com/infotree/queries.php#78) – valex

回答

0

根据@JW,感谢您的协助。

SELECT `month`, 
     MAX(CASE WHEN transporttype = 'Inbound' THEN loads ELSE NULL END) `Inbound`, 
     MAX(CASE WHEN transporttype = 'LocalGauteng' THEN loads ELSE NULL END) `LocalGauteng`, 
     MAX(CASE WHEN transporttype = 'LongDistance' THEN loads ELSE NULL END) `LongDistance`, 
     MAX(CASE WHEN transporttype = 'Shuttle-company1' THEN loads ELSE NULL END) `Shuttle-company1`, 
     MAX(CASE WHEN transporttype = 'Shuttle-company2' THEN loads ELSE NULL END) `Shuttle-company2`, 
     MAX(CASE WHEN transporttype = 'stores' THEN loads ELSE NULL END) `stores`, 
     MAX(CASE WHEN transporttype = 'returns' THEN loads ELSE NULL END) `returns`, 
     MAX(CASE WHEN transporttype = 'localkzn' THEN loads ELSE NULL END) `localkzn` 
FROM 
    (
     SELECT transporttype, 
       CONCAT(MONTHNAME(STR_TO_DATE(month, '%m')), ' ', year) AS `month`, 
       COUNT(loadnumber) AS loads 
     FROM v2ReportingTable 
     WHERE transporttype not in ('Extrusions-LongDistance','Extrusions-Shuttle') AND 
       urgent='no' 
     GROUP BY (concat(MONTHNAME(STR_TO_DATE(month, '%m')),' ',year)), transporttype 
    ) aa 
GROUP BY `month` 
1

匹配你可以使用LEFT JOIN操作。例如:

SELECT s0.month, 
     s1.cost as Inbound, 
     s2.cost as LocalPMB, 
     s3.cost as Shuttle,  
     s4.cost as LongDistance 
    FROM (
     SELECT 1 as month 
      UNION 
     SELECT 2 as month 
      UNION 
     SELECT 3 as month 
      UNION 
     SELECT 4 as month 
      UNION 
     SELECT 5 as month 
      UNION 
     SELECT 6 as month 
      UNION 
     SELECT 7 as month 
      UNION 
     SELECT 8 as month 
      UNION 
     SELECT 9 as month 
      UNION 
     SELECT 10 as month 
      UNION 
     SELECT 11 as month 
      UNION 
     SELECT 12 as month 
     ) as s0 
LEFT JOIN 
     (
     SELECT month, 
       round(sum(cost),0) AS cost 
      FROM v2ReportingTable 
      WHERE urgent='no' 
      AND transporttype='Inbound' 
     GROUP BY month 
     ) as s1 on s0.month=s1.month 
LEFT JOIN 
     (
     SELECT month, 
       round(sum(cost),0) AS cost 
      FROM v2ReportingTable 
      WHERE urgent='no' 
      AND transporttype='LocalPMB' 
     GROUP BY month 
     ) as s2 on s0.month=s2.month 
LEFT JOIN 
     (
     SELECT month, 
       round(sum(cost),0) AS cost 
      FROM v2ReportingTable 
      WHERE urgent='no' 
      AND transporttype='Shuttle' 
     GROUP BY month 
     ) as s3 on s0.month=s3.month 
LEFT JOIN 
     (
     SELECT month, 
       round(sum(cost),0) AS cost 
      FROM v2ReportingTable 
      WHERE urgent='no' 
      AND transporttype='Long Distance' 
     GROUP BY month 
     ) as s4 on s0.month=s4.month 
ORDER BY month 
+0

谢谢奥斯卡,效果不错,但不完全。如果第2,3,4个月没有数据,由于连接的列没有数据,第1个月的相应数据不存在?我们如何强制它显示第一个月的所有数据,以及第二个月,第三个月的数据是否可用等等。外连接?谢谢,瑞安 – Smudger

+0

编辑回应。现在你会得到12行和相应的列。每个列在没有数据的月份都将为空。 –

+0

嗨,这只显示Inbound的值。因为没有其他'传输类型'的值,它显示为空白,因为每个更新后的图像... – Smudger