连接行值以形成一行,内联,而不使用第二个 table,这可能吗?
Concatenating row values to form one row, inline, without use of second table, is it possible?
希望 SQL 知识比我多的人可以在这里提供帮助:)。我有一个结果集,它分布在两行或更多行上,但我需要它都在一行上。我的问题是,如果不使用临时 table(因为这是在 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),它将显示一行,值是水平的而不是垂直的。
如果这可以在不使用临时 table 的情况下完成,这将是更可取的,因为这些数据正在通过 PHP 被拉入数据 table 场景在运行中,这就是为什么它只需要 return 单行值而不是在到达 PHP 之前出现任何复杂情况的原因。这就是为什么我要 SQL 尽可能完成所有工作。
非常感谢任何和所有的帮助,我已经做了好几天了!
通过删除 LineDescription
更改您的 GROUP BY
:
GROUP BY Term
并从 SELECT
中删除 LineDescription
。
GROUP BY
指定结果集中有哪些行。如果您希望每个 Term
的值占一行,那么那应该是 GROUP BY
.
中唯一的一列
如果每个 Term
一行,则不能 select LineDescription
,因为有多个值。无论如何,该信息都在列中。
希望 SQL 知识比我多的人可以在这里提供帮助:)。我有一个结果集,它分布在两行或更多行上,但我需要它都在一行上。我的问题是,如果不使用临时 table(因为这是在 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),它将显示一行,值是水平的而不是垂直的。
如果这可以在不使用临时 table 的情况下完成,这将是更可取的,因为这些数据正在通过 PHP 被拉入数据 table 场景在运行中,这就是为什么它只需要 return 单行值而不是在到达 PHP 之前出现任何复杂情况的原因。这就是为什么我要 SQL 尽可能完成所有工作。
非常感谢任何和所有的帮助,我已经做了好几天了!
通过删除 LineDescription
更改您的 GROUP BY
:
GROUP BY Term
并从 SELECT
中删除 LineDescription
。
GROUP BY
指定结果集中有哪些行。如果您希望每个 Term
的值占一行,那么那应该是 GROUP BY
.
如果每个 Term
一行,则不能 select LineDescription
,因为有多个值。无论如何,该信息都在列中。