连接行值以形成一行,内联,不使用第二个表,这可能吗?

Posted

技术标签:

【中文标题】连接行值以形成一行,内联,不使用第二个表,这可能吗?【英文标题】:Concatenating row values to form one row, inline, without use of second table, is it possible? 【发布时间】:2019-08-08 11:59:05 【问题描述】:

希望比我更了解 SQL 的人可以在这里提供帮助 :)。我有一个结果集,它分布在两行或多行上,但我需要它都在一行上。我的问题是,不使用临时表(因为这是在 php 中动态内联完成的),有没有办法使用 SQL 在选择 AS 时将值放在同一行?

我已经尝试了几种不同的技术,最终达到了现在的状态。以前我尝试过不同的分组方法,但没有任何方法,导致重复数据或错误值。另一种尝试是将值相加到新列中,但这再次导致值不正确。我得到的最接近的是我现在的位置,但是正如您从数据中看到的那样,行是重复的,每个术语应该只有一行,对应的数据在每一列中水平跨越。

这里是 SQL

SELECT
    LineDescription,
    Term,
    SUM(CASE When LineDescription='StandingCharge' Then UnitCharge Else 0 End ) as StandingUnitCharge,
    SUM(CASE When LineDescription='UNIT CHARGE' Then UnitCharge Else 0 End ) as UnitCharge,
    SUM(CASE When LineDescription='DAY UNIT CHARGE' Then UnitCharge Else 0 End ) as DayUnitCharge,
    SUM(CASE When LineDescription='NIGHT UNIT CHARGE' Then UnitCharge Else 0 End ) as NightUnitCharge,
    SUM(CASE When LineDescription='WEEKDAY DAY UNIT CHARGE' Then UnitCharge Else 0 End ) as WeekdayUnitCharge,
    SUM(CASE When LineDescription='EVENING & WEEKEND UNIT CHARGE' Then UnitCharge Else 0 End ) as WeekendUnitCharge,
    SUM(CASE When LineDescription='OFF PEAK UNIT CHARGE' Then UnitCharge Else 0 End ) as OffpeakUnitCharge,
    SUM(CASE When LineDescription='WINTER WEEKDAY PEAK' Then UnitCharge Else 0 End ) as WinterPeakUnitCharge,
    SUM(CASE When LineDescription='WINTER OFF PEAK & SUMMER DAY' Then UnitCharge Else 0 End ) as WinterOffPeakUnitCharge
FROM
    pricebook_bg_elec
WHERE  
ProfileClass='3' AND pes='23' AND SalesType='Acquisition' and StandingCharge='SC' and UnitCharge>0 and 
('2920' between aq_min AND aq_max) AND MeterType='Single Rate' AND 
('2020-07-30' between WindowOpen AND WindowClose) and PaymentMethod='DD'
GROUP BY
    LineDescription,Term

以下是目前的代码结果:

LineDescription Term    StandingUnitCharge  UnitCharge  DayUnitCharge   NightUnitCharge WeekdayUnitCharge   WeekendUnitCharge   OffpeakUnitCharge   WinterPeakUnitCharge    WinterOffPeakUnitCharge
StandingCharge  12  30.24   0   0   0   0   0   0   0   0
UNIT CHARGE 12  0   16.59   0   0   0   0   0   0   0
StandingCharge  24  31.18   0   0   0   0   0   0   0   0
UNIT CHARGE 24  0   16.63   0   0   0   0   0   0   0
StandingCharge  36  43.01   0   0   0   0   0   0   0   0
UNIT CHARGE 36  0   16.58   0   0   0   0   0   0   0
StandingCharge  48  55.02   0   0   0   0   0   0   0   0
UNIT CHARGE 48  0   16.01   0   0   0   0   0   0   0

但是,如上所述,所需的结果是,对于每个术语 (12,24,36,48),它将显示一行,其中的值是水平方向而不是垂直方向。

如果这可以在不使用临时表的情况下完成,这将是更可取的,因为这些数据正在通过 PHP 即时被拉入数据表场景,这就是为什么它只需要返回单个行值,而不是在它到达 PHP 之前的任何复杂性。这就是为什么我尽可能让 SQL 完成所有工作的原因。

任何和所有的帮助都非常感谢,我已经在这几天了!

【问题讨论】:

那么您希望最终结果是什么样的?但是,我也无法理解您现有的数据,这不太可能对我们有所帮助,因为这是您查询的结果,而不是您的实际数据的样子。您能否在查询之前向我们展示您的数据是什么样的? 【参考方案1】:

通过删除 LineDescription 来更改您的 GROUP BY

GROUP BY Term

并从SELECT 中删除LineDescription

GROUP BY 指定结果集中的行。如果您希望 Term 的每个值有一行,那么这应该是 GROUP BY 中的唯一列。

如果每个Term 有一行,则不能选择LineDescription,因为有多个值。无论如何,这些信息都在列中。

【讨论】:

它做到了,我不敢相信我有多近,但我有多远。我已经尝试了很多组合,添加了各种东西并删除了各种东西,但从来没有只对“术语”进行分组,因为我没有看到这里的逻辑,直到我运行它!谢谢@gordon linoff

以上是关于连接行值以形成一行,内联,不使用第二个表,这可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果第二个表不存在连接,Mysql 使用一个表中的列值

如何加入/子查询第二个表

根据第二个表中列 y 的最大值连接列 x 上的 2 个表

在更新前使用触发器将一行插入到我的第二个表中

MySQL 5.5.30 级联触发器不起作用

SQL-获取行值作为列标题