SQL PHP Установите один столбец на ноль, если второй столбец не имеет значения

1

Я получаю данные из 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. Я был бы очень признателен

  • 0
    Вы используете SQL Server или MySQL? Пожалуйста, отметьте вопрос соответствующим образом.
  • 0
    Я использую SQL-сервер, но он использует функции PHP, поэтому MYSQL и SQL Server оба будут работать
Показать ещё 3 комментария
Теги:
sql-server
match
web

2 ответа

0
Лучший ответ
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');

SqlFiddleDemo

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
  • 0
    Эй, @Juan, твой код работает отлично, теперь дело в том, что я не получаю данные из одной таблицы, но я уже делаю объединение, чтобы получить Amt и Period из разных таблиц SELECT sum (CONVERT (float, Amt) ) как sum_amt, конвертировать (float, substring (f.period, 2,4)) как период ОТ заказов b, фискальный f ГДЕ b. [дата выставления счета]> = f.start AND b. [дата выставления счета] <= f. [end] AND f. [year] = '2015' group by convert (float, substring (f.period, 2,4))) Я постараюсь использовать ваш код и изменить свой запрос, но если вы поможете изменить это будет классно
  • 0
    Отредактируйте свой вопрос. С этой информацией и обновите пример данных
Показать ещё 7 комментариев
0

Таблица действительных периодов с периодом полевого вызова (включая 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
  • 0
    Спасибо за помощь, когда я использовал ваш запрос, он не дает мне результат в последовательности
  • 0
    @ wild_dove21 Просто рад, что у тебя все получилось. (Я забыл заказать ORDER BY periods.period.)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню