Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Pivot multiple aggregate  [new]
hewlett
Member

Откуда:
Сообщений: 72
вопрос почему неправильно суммируются дубли в Pivot (поля DecPcs и DecAmt)? Так не получится или что-то не то с синтаксисом?

DECLARE @PivotExample AS  TABLE
(
    MONTH VARCHAR(15),
    YEAR VARCHAR(4),
    PIECES int,
    AMOUNT int
)
INSERT INTO @PivotExample VALUES
        ('Jan','2013',5,500),
        ('Jan','2014',15,2500),
        ('Feb','2013',2,300),
        ('Dec','2013',10,400),
        ('Dec','2013',10,400),
        ('Dec','2014',40,4000)


SELECT YEAR,
             MONTH+'Pcs' AS MonthPcs,
             MONTH+'Amt' AS MonthAmt,
             PIECES,
             AMOUNT
      FROM @PivotExample;

SELECT  YEAR AS Year
		,JanPcs		
		,JanAmt				
		,DecPcs
		,DecAmt
FROM (SELECT YEAR,
             MONTH+'Pcs' AS MonthPcs,
             MONTH+'Amt' AS MonthAmt,
             PIECES,
             AMOUNT
      FROM @PivotExample
	  ) AS T
      PIVOT
     (sum(PIECES) FOR MonthPcs IN
     (JanPcs,FebPcs,MarPcs,AprilPcs,MayPcs,JunePcs,JulyPcs,AugPcs,SepPcs,OctPcs,NovPcs,DecPcs)) AS P1
      PIVOT
     (sum(AMOUNT) FOR MonthAmt IN
     (JanAmt,FebAmt,MarAmt,AprilAmt,MayAmt,JuneAmt,JulyAmt,AugAmt,SepAmt,OctAmt,NovAmt,DecAmt)) AS P2;


исходные данные (добавлено поле месяца для каждого пивота)

YEARMonthPcs MonthAmt PIECES AMOUNT
2013 JanPcs JanAmt 5 500
2014 JanPcs JanAmt 15 2500
2013 FebPcs FebAmt 2 300
2013 DecPcs DecAmt 10 400
2013 DecPcs DecAmt 10 400
2014 DecPcs DecAmt 40 4000


результат запроса

Year JanPcs JanAmt DecPcs DecAmt
2013 NULL NULL 20 400
2013 NULL NULL NULL NULL
2013 5 500 NULL NULL
2014 NULL NULL 40 4000
2014 15 2500 NULL NULL


вопрос почему за 2013 год для DecPcs просуммировалось (10=10=20), а для DecAmt нет (400+400=800, а пишет 400).

если поменять значения для DecPcs таким образом

YEARMonthPcs MonthAmt PIECES AMOUNT
2013 JanPcs JanAmt 5 500
2014 JanPcs JanAmt 15 2500
2013 FebPcs FebAmt 2 300
2013 DecPcs DecAmt 10 400
2013 DecPcs DecAmt 10 500
2014 DecPcs DecAmt 40 4000


то теперь DecAmt суммируется (400+500=900), а DecPcs нет (10+10=20, а пишет 10)

Year JanPcs JanAmt DecPcs DecAmt
2013 NULL NULL 10 900
2013 NULL NULL NULL NULL
2013 5 500 NULL NULL
2014 NULL NULL 40 4000
2014 15 2500 NULL NULL


Если отдельные пивоты то все правильно суммирует.
13 ноя 18, 15:01    [21733076]     Ответить | Цитировать Сообщить модератору
 Re: Pivot multiple aggregate  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 327
hewlett,

В плане запроса в Stream Aggregate поле amount входит в условие группировки group by. А для последующего PIVOT - а - нет.
13 ноя 18, 15:33    [21733145]     Ответить | Цитировать Сообщить модератору
 Re: Pivot multiple aggregate  [new]
Rigersong
Member

Откуда:
Сообщений: 5
DECLARE @PivotExample AS TABLE
(
MONTH VARCHAR(15),
YEAR VARCHAR(4),
PIECES int,
AMOUNT int
)

INSERT INTO @PivotExample
VALUES ('Jan', '2013', 5, 500),
('Jan', '2014', 15, 2500),
('Feb', '2013', 2, 300),
('Dec', '2013', 10, 400),
('Dec', '2013', 10, 400),
('Dec', '2014', 40, 4000)

SELECT YEAR
, JanPcs
, FebPcs
, DecPcs
, JanAmt
, FebAmt
, DecAmt
FROM (
SELECT YEAR
, MONTH + 'Pcs' AS MonthPcs
, MONTH + 'Amt' AS MonthAmt
, SumAmount = SUM(AMOUNT)
, SumPieces = SUM(PIECES)
FROM @PivotExample
GROUP BY PIECES, YEAR, MONTH, AMOUNT
) t
PIVOT(
SUM(SumPieces) FOR MonthPcs IN
(JanPcs, FebPcs, DecPcs)
)p1
PIVOT(
SUM(SumAmount) FOR MonthAmt IN
(JanAmt, FebAmt, DecAmt)
)p2
13 ноя 18, 15:51    [21733193]     Ответить | Цитировать Сообщить модератору
 Re: Pivot multiple aggregate  [new]
hewlett
Member

Откуда:
Сообщений: 72
Rigersong
DECLARE @PivotExample AS TABLE
(
MONTH VARCHAR(15),
YEAR VARCHAR(4),
PIECES int,
AMOUNT int
)

INSERT INTO @PivotExample
VALUES ('Jan', '2013', 5, 500),
('Jan', '2014', 15, 2500),
('Feb', '2013', 2, 300),
('Dec', '2013', 10, 400),
('Dec', '2013', 10, 400),
('Dec', '2014', 40, 4000)

SELECT YEAR
, JanPcs
, FebPcs
, DecPcs
, JanAmt
, FebAmt
, DecAmt
FROM (
SELECT YEAR
, MONTH + 'Pcs' AS MonthPcs
, MONTH + 'Amt' AS MonthAmt
, SumAmount = SUM(AMOUNT)
, SumPieces = SUM(PIECES)
FROM @PivotExample
GROUP BY PIECES, YEAR, MONTH, AMOUNT
) t
PIVOT(
SUM(SumPieces) FOR MonthPcs IN
(JanPcs, FebPcs, DecPcs)
)p1
PIVOT(
SUM(SumAmount) FOR MonthAmt IN
(JanAmt, FebAmt, DecAmt)
)p2



ага, т.е сначала просуммировать, потом перевернуть.
Одновременно не получается значит.
13 ноя 18, 16:02    [21733208]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить