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