Я получаю данные из Sql, используя PHP, 2 столбца, Amt и Period
обычно количество является чистым, что означает, что amt и период доступны. Период равен 1-12, и для этих столбцов доступен amt
Amount Period
100 P1
125 P1
150 P2
160 P3
120 P4
130 P5
160 P6
170 P7
180 P8
145 P9
144 P10
155 P11
160 P12
Я запускаю запрос, чтобы получить поле amt и поле периода из двух разных таблиц на основе даты и т.д., Как показано ниже
SELECT Sum(CONVERT(FLOAT, amt)) AS sum_amt,
CONVERT(FLOAT, Substring(f.period, 2, 4)) AS period
FROM bookings b,
fiscalcal f
WHERE b.[invoice date] >= f.start
AND b.[invoice date] <= f.[end]
AND f.[year] = '2015'
GROUP BY CONVERT(FLOAT, Substring(f.period, 2, 4))
для получения правильных данных
Я нахожусь в ситуации, когда отсутствуют некоторые периоды, такие как P4, P5, поэтому нет строки с периодом P4, P5, но на веб-странице я должен отображать нуль для суммы в случае периода P4, P5. Я не могу этого сделать.
поэтому он должен выглядеть
amount period
225 P1
150 P2
160 P3
0 P4
0 P5
160 P6
170 P7
180 P8
145 P9
144 P10
155 P11
165 P12
Пожалуйста, помогите, как это сделать на PHP и SQL. Я был бы очень признателен
CREATE TABLE YourTable
([Amount] int, [Period] varchar(3));
INSERT INTO YourTable
([Amount], [Period])
VALUES
(100, 'P1'), (125, 'P1'),
(150, 'P2'),
(160, 'P3'), (120, 'P3'),
(130, 'P6'), (160, 'P6'),
(170, 'P7'),
(180, 'P8'),
(145, 'P9'),
(144, 'P10'),
(155, 'P11'),
(160, 'P12');
WITH periods (period_id) AS (
SELECT 'P1' UNION ALL
SELECT 'P2' UNION ALL
SELECT 'P3' UNION ALL
SELECT 'P4' UNION ALL
SELECT 'P5' UNION ALL
SELECT 'P6' UNION ALL
SELECT 'P7' UNION ALL
SELECT 'P8' UNION ALL
SELECT 'P9' UNION ALL
SELECT 'P10' UNION ALL
SELECT 'P11' UNION ALL
SELECT 'P12'
)
SELECT SUM(COALESCE(Amount, 0)), p.period_id
FROM periods p
LEFT JOIN YourTable y
ON p.period_id = y.Period
GROUP BY p.period_id
ВЫВОД
| | period_id |
|-----|-----------|
| 225 | P1 |
| 150 | P2 |
| 280 | P3 |
| 0 | P4 |
| 0 | P5 |
| 290 | P6 |
| 170 | P7 |
| 180 | P8 |
| 145 | P9 |
| 144 | P10 |
| 155 | P11 |
| 160 | P12 |
РЕДАКТИРОВАТЬ
После того, как ваше редактирование выглядит так, вы можете просто поставить свой запрос в другой cte.
WITH periods (period_id) AS (
SELECT 'P1' UNION ALL
SELECT 'P2' UNION ALL
SELECT 'P3' UNION ALL
SELECT 'P4' UNION ALL
SELECT 'P5' UNION ALL
SELECT 'P6' UNION ALL
SELECT 'P7' UNION ALL
SELECT 'P8' UNION ALL
SELECT 'P9' UNION ALL
SELECT 'P10' UNION ALL
SELECT 'P11' UNION ALL
SELECT 'P12'
),
YourTable (Amount, period) AS (
SELECT Sum(CONVERT(FLOAT, amt)) AS sum_amt,
CONVERT(FLOAT, Substring(f.period, 2, 4)) AS period
FROM bookings b,
fiscalcal f
WHERE b.[invoice date] >= f.start
AND b.[invoice date] <= f.[end]
AND f.[year] = '2015'
GROUP BY CONVERT(FLOAT, Substring(f.period, 2, 4))
)
SELECT SUM(COALESCE(Amount, 0)), p.period_id
FROM periods p
LEFT JOIN YourTable y
ON p.period_id = y.Period
GROUP BY p.period_id
Таблица действительных периодов с периодом полевого вызова (включая P01 - P12).
SELECT periods.period, sum(convert(float,AMT)) as sum_amt2
from Periods
left join Sales on periods.period = substring(sales.period,2,4)
group by periods.period