Сводная таблица MySQL с использованием java

#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; 
 

Demo

Комментарии:

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. имя партнеров будет задано как столбец динамически. Посмотрите результат. Спасибо