T- SQL: строки в столбцы - PullRequest
0 голосов
/ 06 мая 2020

Я SQL новичок, может ли кто-нибудь помочь мне с этим?

У меня есть такая таблица

YearMonth | Customer | Currency | BusinessType | Amount
04-2020   | 123      | EUR      | Budget       | 500
04-2020   | 123      | EUR      | Forecast     | 300
04-2020   | 123      | EUR      | Sales        | 700

И теперь мне это нужно, например:

YearMonth | Customer | Currency | Amount Budget | Amount Forecast | Amount Sales  
04-2020   | 123      | EUR      | 500           | 300             | 700

Возможно ли подобное? Заранее благодарим за помощь!

Ответы [ 4 ]

1 голос
/ 06 мая 2020

Вы можете агрегировать:

select yearmonth, customer, currency,
       sum(case when businesstype = 'budget' then amount else 0 end),
       sum(case when businesstype = 'Forecast' then amount else 0 end),
       sum(case when businesstype = 'Sales' then amount else 0 end) 
from table t
group by yearmonth, customer, currency;
1 голос
/ 06 мая 2020

Использовать условное агрегирование:

select yearmonth, customer, currency,
       sum(case when businesstype = 'Budget' then amount end) as budget,
       sum(case when businesstype = 'Forecast' then amount end) as forecast,
       sum(case when businesstype = 'Sales' then amount end) as sales
from t
group by yearmonth, customer, currency;
0 голосов
/ 06 мая 2020

Этот тип требований обычно решается с помощью реляционной операции T- SQL PIVOT (https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15). В приведенном выше примере я использовал следующий запрос, чтобы добиться этого:

-- Create a temporary table to store the data.
IF (OBJECT_ID('tempdb..##temp2') IS NOT NULL) DROP TABLE ##temp2
CREATE TABLE ##temp2 (Id int IDENTITY (1,1) PRIMARY KEY, YearMonth varchar(100), Customer int, Currency varchar(100), BusinessType varchar(100), Amount int)
INSERT ##temp2
VALUES
('04-2020', 123,'EUR','Sales', 700),
('04-2020', 123,'EUR','Budget', 500),
('04-2020', 123,'EUR','Forecast', 300)
-- Using PIVOT allows you to move rows into columns
SELECT  pivot_table.YearMonth,
        pivot_table.Customer,
        pivot_table.Currency,
        [Amount Forecast] = pivot_table.Forecast,
        [Amount Budget] = pivot_table.Budget,
        [Amount Sales] = pivot_table.Sales
FROM
        (
            SELECT  YearMonth,
                    Customer,
                    Currency,
                    BusinessType,
                    Amount
            FROM    ##temp2
        ) t
PIVOT
(
    SUM(Amount)
    FOR BusinessType IN ([Sales], [Budget], [Forecast])
) AS pivot_table;
0 голосов
/ 06 мая 2020

Кроме того, вы можете добавить «Другое», чтобы фиксировать любые новые типы бизнеса:

select yearmonth, customer, currency,
       sum(case when businesstype = 'Budget' then amount end) as budget,
       sum(case when businesstype = 'Forecast' then amount end) as forecast,
       sum(case when businesstype = 'Sales' then amount end) as sales,
       sum(case when businesstype not in ('Budget', 'Forecast', 'Sales') then amount end) as other
from t
group by yearmonth, customer, currency;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...