#mysql #sql #pivot
#mysql #sql #сводная
Вопрос:
У меня есть одна таблица BPFinal и имеет следующий столбец
ID | Partners | Branch | Amount | Date
1001 | ABC | BO1 | 2,000 | 2020/11/30
1001 | ABC | BO2 | 1,500 | 2020/11/30
1002 | XYZ | BO1 | 4,000 | 2020/11/30
1001 | ABC | BO1 | 5,000 | 2020/10/31
Я пытаюсь написать sql для создания сводной таблицы с динамическими заголовками партнеров. После установки даты в ней будут отображаться только доступные партнеры и соответствующие им данные для каждой ветки.
Вывод должен быть таким:
Дата : 2020/11/30
Branches | ABC | XYZ
BO1 | 2,000 | 4,000
BO2 | 1,500 | 0.00
Дата: 2020/10/31
Branches | ABC
BO1 | 5,000
Буду признателен за любую помощь в написании SQL. Спасибо
Комментарии:
1. Здравствуйте, спросите Warvin, почему ABC для B01 2000? Разве это не должно быть 5000 2000 = 7000??
2. это сумма с соответствующей датой, что означает, что если я выберу 2020/11/30, сумма в 5000 не будет включена.
3. Серьезно рассмотрите проблемы отображения данных в коде приложения. Я боюсь, что приведенные ниже ответы ведут вверх по садовой дорожке.
4. artfulsoftware.com/infotree/qrytip.php?id=523amp;m=0 ознакомьтесь с этой статьей
Ответ №1:
Вы можете использовать динамический SQL для динамического поворота, например
SET @sql = NULL;
SET @date = '2020-11-30';
SELECT GROUP_CONCAT(
CONCAT(
'SUM(CASE WHEN Partners = "', Partners,'" THEN Amount ELSE 0 END ) AS'
,Partners
)
)
INTO @sql
FROM ( SELECT DISTINCT Partners FROM BPFinal WHERE Date = @date ) AS b;
SET @sql = CONCAT('SELECT Branch,',@sql,
' FROM BPFinal
WHERE Date = "',@date,'"'
' GROUP BY Branch');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Комментарии:
1. Есть ли у вас какие-либо запросы в MySQL для выполнения некоторых сводных данных?
Ответ №2:
Вы хотите получить имена столбцов таблицы: вот так:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='db_name'
AND `TABLE_NAME`='table'
AND COLUMN_NAME IN (SELECT Partners FROM TABLE_NAME);
Затем вы хотите объединить имена следующим образом:
SELECT COLUMN_NAMES, `<column>`
FROM table
UNION
SELECT COLUMN_NAMES, `<column>`
FROM table
И затем вы хотите указать дату:
SELECT COLUMN_NAMES
FROM table
WHERE DATE = 'DATEVALUE'
Не забудьте выполнить объединение результатов каждого из запросов, это немного сложно, но если вы будете смотреть на это достаточно долго, вы должны это получить. 🙂
Комментарии:
1. имя партнеров будет задано как столбец динамически. Посмотрите результат. Спасибо