TSQL - рассчитать значения для растений и лет за месяцы - PullRequest
1 голос
/ 15 мая 2019

У меня есть следующий расчет Excel, который я хочу скопировать в оператор T-SQL: example

Этот Excel импортируется в таблицу SQL (SQL Server 2012) в том же формате с двумя дополнительными столбцами для завода и года.

Ниже мое представление SQL, которое я использую для отчетов. Как видите, месяцы стали строками, а строки-столбцы значений:

+---------+------+-------+------+--------+
|  Plant  | Year | Month |  A   |   B    |
+---------+------+-------+------+--------+
| Plant X | 2019 |     1 |  526 | 16     |
| Plant X | 2019 |     2 |  786 | 54     |
| Plant X | 2019 |     3 | 1800 | 85     |
| Plant X | 2019 |     4 | 9780 | 15     |
| Plant X | 2019 |     5 | 9780 | (null) |
| Plant Y | 2019 |     1 | 4080 | 128    |
| Plant Y | 2019 |     2 | 1387 | 179    |
+---------+------+-------+------+--------+

Вот Fiddle для просмотра выше sql.

CREATE TABLE Test
    ([Plant] varchar(13), [Year] int, [Month] int, [A] decimal(18,2), [B] decimal(18,2))
;

INSERT INTO Test
    ([Plant], [Year], Month, A, B)
VALUES
    ('Plant X', 2019,1,526 ,16 ),
    ('Plant X', 2019,2,786 ,54),
    ('Plant X', 2019,3, 1800,85),
    ('Plant X', 2019,4, 9780,15),
    ('Plant X', 2019,5, 9780,NULL),
    ('Plant Y', 2019,1,4080 ,128 ),
    ('Plant Y', 2019,2,1387 ,179)
;

Можно ли выполнить вычисления в моем представлении SQL, как показано на изображении Excel выше? Если да, можете ли вы показать пример?

Поскольку у меня также есть данные в таблице SQL, точно так же, как в структуре Excel (с месяцами в виде столбцов), имеет ли смысл выполнять вычисления в этом формате?

Спасибо.

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Быстро и с вашей таблицей образцов это может выглядеть так:

select t.*
    , Calculated = (
        select cast(round(sum(B) * 1000000 / sum(A), 0) as int)
        from Test
        where Plant = t.Plant
            and [Year] = t.[Year]
            and [Month] <= t.[Month]
        having sum(A) <> 0
        )
from Test t
1 голос
/ 15 мая 2019

Это проблема, связанная с необходимостью отключить некоторые столбцы и повернуть другой.Чтобы отключить, я использую CROSS APPLY и table values constructor, что очень универсально (в отличие от оператора отмены).Я также использую метод перекрестных вкладок для поворота данных.

SELECT  Plant, [Year], colName,
    SUM(CASE WHEN [Month] = 1 THEN colValue END),
    SUM(CASE WHEN [Month] = 2 THEN colValue END),
    SUM(CASE WHEN [Month] = 3 THEN colValue END),
    SUM(CASE WHEN [Month] = 4 THEN colValue END),
    SUM(CASE WHEN [Month] = 5 THEN colValue END),
    SUM(CASE WHEN [Month] = 6 THEN colValue END),
    SUM(CASE WHEN [Month] = 7 THEN colValue END)
FROM Test
CROSS APPLY( VALUES( 'A', A),( 'B', B)) AS x(colName, colValue)
GROUP BY Plant, [Year], colName
ORDER BY Plant, [Year], colName;
0 голосов
/ 15 мая 2019

Вы также можете достичь этого, используя PIVOT и UNPIVOT в TSQL.

SELECT [Plant]
  ,[Year]
  ,[newColumn]
  ,SUM([1]) [1]
  ,SUM([2]) [2]
  ,SUM([3]) [3]
  ,SUM([4]) [4]
  ,SUM([5]) [5]
FROM [Test]
UNPIVOT(Orders FOR newColumn IN (
          A
         ,B
        )) AS unpvt
PIVOT(SUM([Orders]) FOR [Month] IN (
         [1]
        ,[2]
        ,[3]
        ,[4]
        ,[5]
        )) AS PivotTable
GROUP BY [Plant]
  ,[Year]
  ,[newColumn]
...