在 MySQL 中旋转 table 并添加列标题

Pivot a table in MySQL and add column headings

我在 MySQL 中生成了一小部分结果。这些结果需要显示在 SSRS 报告折线图上,但在目前的格式下这似乎是不可能的。

这是当前结果集:

这就是我认为它可能起作用的方式

我在想,通过旋转 table 并添加列 headers SSRS 可能能够理解我想要实现的目标并正确显示数据。

我看过这里和其他地方,但所有的解决方法似乎都非常复杂。有没有一种方法可以简单地旋转数据并添加列 headers,或者我最好使用 re-working 和 MySQL 以不同的方式生成数据?

这是我目前拥有的代码,我提前道歉,但我是新手

Select SUM(OutcomeTimes2.CurrentMonth) as SumOfCurrentMonth,     SUM(OutcomeTimes2.CurrentLess1) as SumOfCurrentLess1, SUM(OutcomeTimes2.CurrentLess2) as SumOfCurrentLess2, SUM(OutcomeTimes2.CurrentLess3) as SumOfCurrentLess3, SUM(OutcomeTimes2.CurrentLess4) as SumOfCurrentLess4, SUM(OutcomeTimes2.CurrentLess5) as SumOfCurrentLess5, SUM(OutcomeTimes2.CurrentLess6) as SumOfCurrentLess6
from (SELECT OutcomeTimes.organisation_name, OutcomeTimes.organisation_id, OutcomeTimes.name, OutcomeTimes.order_no, ifnull(OutcomeTimes.budgetcode,"No Budget Code")as budgetcode, ifnull(OutcomeTimes.budgetname,"No Budget Name")as budgetname, Sum(OutcomeTimes.Budget_Duration) AS SumOfBudget_Duration, Sum(OutcomeTimes.Actual_Duration) AS SumOfActual_Duration, OutcomeTimes.the_date, Ifnull(outcome,"No Outcome") AS Outcome_rec
, if(date_format(date(OutcomeTimes.the_date), '%m %Y')=date_format(date_sub(now(), interval 0 MONTH), '%m %Y'),1,0) as CurrentMonth
, if(date_format(date(OutcomeTimes.the_date), '%m %Y')=date_format(date_sub(now(), interval 1 MONTH), '%m %Y'),1,0) as CurrentLess1, if(date_format(date(OutcomeTimes.the_date), '%m %Y')=date_format(date_sub(now(), interval 2 MONTH), '%m %Y'),1,0) as CurrentLess2, if(date_format(date(OutcomeTimes.the_date), '%m %Y')=date_format(date_sub(now(), interval 3 MONTH), '%m %Y'),1,0) as CurrentLess3
, if(date_format(date(OutcomeTimes.the_date), '%m %Y')=date_format(date_sub(now(), interval 4 MONTH), '%m %Y'),1,0) as CurrentLess4, if(date_format(date(OutcomeTimes.the_date), '%m %Y')=date_format(date_sub(now(), interval 5 MONTH), '%m %Y'),1,0) as CurrentLess5, if(date_format(date(OutcomeTimes.the_date), '%m %Y')=date_format(date_sub(now(), interval 6 MONTH), '%m %Y'),1,0) as CurrentLess6
FROM (SELECT qry_bookings.organisation_id, qry_bookings.organisation_name, qry_bookings.order_no, qry_bookings.the_date, qry_bookings.start_Time, qry_bookings.end_Time, TIMESTAMPDIFF(MINUTE,start_Time,end_Time) AS Budget_Duration, if(qry_bookings.name ="","No Name",qry_bookings.name) as name , qry_bookings.actual_start_Time, qry_bookings.actual_end_Time, TIMESTAMPDIFF(MINUTE,actual_start_Time,qry_bookings.actual_end_Time) AS Actual_Duration, qry_bookings.budgetcode, qry_bookings.budgetname, qry_bookings.outcome, schedule_overview.outcome_code_desc
FROM qry_bookings INNER JOIN schedule_overview ON qry_bookings.schedule_id = schedule_overview.schedule_id
WHERE ((qry_bookings.business_unit_id="2") AND (qry_bookings.deleted_from_schedule=0) and (qry_bookings.the_date Between CAST(DATE_FORMAT(date_sub(now(), interval 6 MONTH) ,'%Y-%m-01') as DATE) And Now())) and (((qry_bookings.organisation_id)="797007013984") OR 
(((qry_bookings.organisation_id)="363079430613984")) OR 
(((qry_bookings.organisation_id)="137952779314169")) OR 
(((qry_bookings.organisation_id)="996006860914169")) OR 
(((qry_bookings.organisation_id)="289833198813984")) OR 
(((qry_bookings.organisation_id)="581692616814417")) OR
(((qry_bookings.organisation_id)="70247802713984")) OR
(((qry_bookings.organisation_id)="917771077113984")) OR
(((qry_bookings.organisation_id)="317283772114056")) OR
(((qry_bookings.organisation_id)="592108421914555")) OR
(((qry_bookings.organisation_id)="177551075713984")) OR
(((qry_bookings.organisation_id)="28576585213984")) OR
(((qry_bookings.organisation_id)="180051500814593")) OR
(((qry_bookings.organisation_id)="472612326714612")) OR
(((qry_bookings.organisation_id)="865056550613984")) OR
(((qry_bookings.organisation_id)="50126601513984")) OR
(((qry_bookings.organisation_id)="124179841214194")) OR
(((qry_bookings.organisation_id)="407940379014254")) OR
(((qry_bookings.organisation_id)="409966399013984")) OR
(((qry_bookings.organisation_id)="747474374413984")) OR
(((qry_bookings.organisation_id)="788147281813987")))
ORDER BY qry_bookings.organisation_name, qry_bookings.name) AS OutcomeTimes
GROUP BY OutcomeTimes.organisation_name, OutcomeTimes.name, OutcomeTimes.order_no, OutcomeTimes.budgetcode, OutcomeTimes.budgetname, OutcomeTimes.the_date, IfNull(outcome,"No Outcome")) as OutcomeTimes2

提前谢谢你们,你们很聪明,一直提供很大的帮助

考虑到您的 SELECT 查询的复杂性,为简单起见,假设您的查询是:

SELECT 1040 AS 'a', 3279 AS 'b', 3582 AS 'c';

一个简单的解决方案是使用 SELECT INTO 将列存储为变量,然后 SELECT 根据您的需要使用另一个查询来存储变量:

SELECT 1040 AS 'a', 3279 AS 'b', 3582 AS 'c' INTO @a, @b, @c;
SELECT 'SumOfCurrentMonth' AS 'Month', @a AS Outcomes UNION ALL
SELECT 'SumOfCurrentLess1' AS 'Month', @b AS Outcomes UNION ALL
SELECT 'SumOfCurrentLess2' AS 'Month', @c AS Outcomes

换句话说:

SELECT SUM(OutcomeTimes2.CurrentMonth) as SumOfCurrentMonth,
       SUM(OutcomeTimes2.CurrentLess1) as SumOfCurrentLess1,
       SUM(OutcomeTimes2.CurrentLess2) as SumOfCurrentLess2,
       SUM(OutcomeTimes2.CurrentLess3) as SumOfCurrentLess3,
       SUM(OutcomeTimes2.CurrentLess4) as SumOfCurrentLess4,
       SUM(OutcomeTimes2.CurrentLess5) as SumOfCurrentLess5,
       SUM(OutcomeTimes2.CurrentLess6) as SumOfCurrentLess6
       INTO @a,@b,@c,@d,@e,@f,@g
FROM ... ;
SELECT 'SumOfCurrentMonth' AS 'Month', @a AS Outcomes UNION ALL
SELECT 'SumOfCurrentLess1' AS 'Month', @b AS Outcomes UNION ALL
SELECT 'SumOfCurrentLess2' AS 'Month', @c AS Outcomes UNION ALL
SELECT 'SumOfCurrentLess3' AS 'Month', @d AS Outcomes UNION ALL
SELECT 'SumOfCurrentLess4' AS 'Month', @e AS Outcomes UNION ALL
SELECT 'SumOfCurrentLess5' AS 'Month', @f AS Outcomes UNION ALL
SELECT 'SumOfCurrentLess6' AS 'Month', @g AS Outcomes;