Piotr Trychta

Piotr Trychta Programista .NET

Temat: [MsSQL] grupowanie danych - Pivot

Mam 4 tabele
(nie wypisuje wszystkich pól)

FakturaSprzet:
ID
FakturaID
Koszt

Faktura:
ID
DataDodania
DostawaID

RejestracjaPojazduDostawczego: (który obsługuje konkretną dostawę)
DostawaID
PojazdRejestracjaID

PojazdRejestracja:
ID
NumerRejestracja

Trzeba wybrać datę początkową i końcową (np 1 styczeń i 31 marzec) i policzyć sumę faktur obsługiwanych przez pojazd w miesiącu
wynik zapytania ma wyglądać mniej więcej tak:

NumerRejestracja | 01 Sty-31 Sty | 01Lut -28Lut | 01 Mar - 31 Mar
RDE-xx03 | 1000zł | 2000zł | 400zł
KT-001 | 2000zł | 400zł | 500zł
RZ-00001 | 3000zł | 750zł | 600zł

problem jest takie żeby to pogrupować w kolumnach po pełnych miesiącach, jak za to się zabrać?
Ja próbowałem wykorzystać do tego Pivot ale za słabym skutkiem...
Piotr Trychta

Piotr Trychta Programista .NET

Temat: [MsSQL] grupowanie danych - Pivot

tu jest odpowiedz http://www.kodyaz.com/articles/t-sql-pivot-tables-in-s...

SELECT *
FROM(
SELECT
YEAR(DueDate) [Year],
CASE MONTH(DueDate)
WHEN 1 THEN 'January'
WHEN 2 THEN 'February'
WHEN 3 THEN 'March'
WHEN 4 THEN 'April'
WHEN 5 THEN 'May'
WHEN 6 THEN 'June'
WHEN 7 THEN 'July'
WHEN 8 THEN 'August'
WHEN 9 THEN 'September'
WHEN 10 THEN 'October'
WHEN 11 THEN 'November'
WHEN 12 THEN 'December'
END as [Month],
ProductID,
OrderQty
FROM Production.WorkOrder
) WorkOrders
PIVOT
(
SUM(OrderQty)
FOR [Month] IN (
[January],[February],[March],[April],
[May],[June],[July],[August],
[September],[October],[November],[December]
)
) AS PivotTable
ORDER BY [Year], ProductID

Ale jak odfiltrować kolumny gdzie są nulle?

Temat: [MsSQL] grupowanie danych - Pivot

drop table #dostawy
select a.NumerRejestracja, c.DataDodania, d.Koszt
into #dostawy
from PojazdRejestracja a
inner join RejestracjaPojazduDostawczego b on a.ID=b.PojazdRejestracjaID
inner join Faktura c on b.DostawaID=c.DostawaID
inner join FakturaSprzet d on c.ID=d.FakturaID
--select * from #dostawy

--zamiast w CASE wolę miesiące w tabeli tymczasowej
drop table #miesiace
create table #miesiace (nr int, mc varchar(15))
insert into #miesiace select 1, 'Styczeń'
insert into #miesiace select 2, 'Luty'
insert into #miesiace select 3, 'Marzec'
insert into #miesiace select 4, 'Kwiecień'
insert into #miesiace select 5, 'May'
insert into #miesiace select 6, 'Czerwiec'
insert into #miesiace select 7, 'Lipiec'
insert into #miesiace select 8, 'Sierpień'
insert into #miesiace select 9, 'Wrzesień'
insert into #miesiace select 10, 'Październik'
insert into #miesiace select 11, 'Listopad'
insert into #miesiace select 12, 'Grudzień'

--tutaj przygotowuję wsad do tebeli przestawnej
drop table #dane
select a.mc, yy=year(b.DataDodania), b.NumerRejestracja, Koszt=sum(b.Koszt)
into #dane
from #miesiace a
inner join #dostawy b on a.nr=month(b.DataDodania)
group by a.mc, year(b.DataDodania), b.NumerRejestracja
--select * from #dane

declare @cols nvarchar(1000);
declare @sql nvarchar(2000);
--tutaj kolumny :) używam FOR XML ale równie dobrze można przygotować taki ciąg znaków w pętli
select @cols=STUFF((select N'],['+mc from #miesiace order by nr for xml path('')), 1, 2, '') + N']';
--select @cols

set @sql =
N'select * from ( ' +
N'select * from #dane ' +
N') O pivot (sum(Koszt) for mc in (' + @cols + N')) P;';

exec(@sql);

mam nadzieję że pomogłem :)

konto usunięte

Temat: [MsSQL] grupowanie danych - Pivot

Piotr Trychta:
tu jest odpowiedz http://www.kodyaz.com/articles/t-sql-pivot-tables-in-s...

SELECT *
FROM(
SELECT
YEAR(DueDate) [Year],
CASE MONTH(DueDate)
WHEN 1 THEN 'January'
WHEN 2 THEN 'February'
WHEN 3 THEN 'March'
WHEN 4 THEN 'April'
WHEN 5 THEN 'May'
WHEN 6 THEN 'June'
WHEN 7 THEN 'July'
WHEN 8 THEN 'August'
WHEN 9 THEN 'September'
WHEN 10 THEN 'October'
WHEN 11 THEN 'November'
WHEN 12 THEN 'December'
END as [Month],
ProductID,
OrderQty
FROM Production.WorkOrder
) WorkOrders
PIVOT
(
SUM(OrderQty)
FOR [Month] IN (
[January],[February],[March],[April],
[May],[June],[July],[August],
[September],[October],[November],[December]
)
) AS PivotTable
ORDER BY [Year], ProductID

Ale jak odfiltrować kolumny gdzie są nulle?

SET LANGUAGE Polish
select DATENAME (mm,GETDATE())


zobacz jak działą coś takiego co by było po polskiemu
Katarzyna Pytlik

Katarzyna Pytlik Zespół Rozwoju
Aplikacji, CBB Call
Center

Temat: [MsSQL] grupowanie danych - Pivot

Witam,

szukałam długo i nie znalazłam.

Chciałabym potwierdzić, że w 2005 w PIVOT można użyć tylko funkcji agregujących i nie ma opcji analogicznej jak "pole obliczeniowe" w Excel, która pozwala na dokonywanie dowolnych obliczeń.

Pozdrawiam!
Krzysztof Raczkowski

Krzysztof Raczkowski Stała współpraca,
Logifact-Systems Sp.
z o.o.

Temat: [MsSQL] grupowanie danych - Pivot

Katarzyna Pytlik:
Witam,

szukałam długo i nie znalazłam.

Chciałabym potwierdzić, że w 2005 w PIVOT można użyć tylko funkcji agregujących i nie ma opcji analogicznej jak "pole obliczeniowe" w Excel, która pozwala na dokonywanie dowolnych obliczeń.

Hmm ale możesz napisać własną funkcję agregującą: http://msdn.microsoft.com/en-us/library/ms182741.aspx i użyć w PIVOT - nie do końca to jest analogia do Excela ale ... jakieś wyjście jest :)

--
Pozdr.
K.R.
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: [MsSQL] grupowanie danych - Pivot

Katarzyna Pytlik:
Witam,

szukałam długo i nie znalazłam.

Proponuję, abyś napisała co chcesz policzyć, a myślę, że znajdzie się jakiś sposób.
Katarzyna Pytlik

Katarzyna Pytlik Zespół Rozwoju
Aplikacji, CBB Call
Center

Temat: [MsSQL] grupowanie danych - Pivot

Krzysztof Raczkowski:
Katarzyna Pytlik:
Witam,

szukałam długo i nie znalazłam.

Chciałabym potwierdzić, że w 2005 w PIVOT można użyć tylko funkcji agregujących i nie ma opcji analogicznej jak "pole obliczeniowe" w Excel, która pozwala na dokonywanie dowolnych obliczeń.

Hmm ale możesz napisać własną funkcję agregującą: http://msdn.microsoft.com/en-us/library/ms182741.aspx i użyć w PIVOT - nie do końca to jest analogia do Excela ale ... jakieś wyjście jest :)

--
Pozdr.
K.R.

W sumie racja, dzięki :)

Edit: chociaż chyba nie do końca, choć muszę też poczytać o f.agregujących, bo nie pisałam jeszcze swojej.
Łukasz Kurowski:

Proponuję, abyś napisała co chcesz policzyć, a myślę, że znajdzie się jakiś sposób.

Potrzebuję obliczyć stosunek jednej wartości do drugiej.Katarzyna Pytlik edytował(a) ten post dnia 28.09.11 o godzinie 14:20
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: [MsSQL] grupowanie danych - Pivot

Katarzyna Pytlik:
Potrzebuję obliczyć stosunek jednej wartości do drugiej.

czyli pivot miałby wstawiać kolumna_1/kolumna2 ?
Katarzyna Pytlik

Katarzyna Pytlik Zespół Rozwoju
Aplikacji, CBB Call
Center

Temat: [MsSQL] grupowanie danych - Pivot

Zestaw danych:
id hour val1 val2
a 1 50 100
a 2 80 100
a 3 92 100
b 1 50 100
b 2 80 100
b 3 92 100
c 1 50 100
c 2 80 100
c 3 92 100

Żądany wynik:
id/hour 1 2 3
a val1/va2 val1/va2 val1/va2
b val1/va2 val1/va2 val1/va2
c val1/va2 val1/va2 val1/va2
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: [MsSQL] grupowanie danych - Pivot

Katarzyna Pytlik:
Zestaw danych:
id hour val1 val2
a 1 50 100
a 2 80 100
a 3 92 100
b 1 50 100
b 2 80 100
b 3 92 100
c 1 50 100
c 2 80 100
c 3 92 100

Żądany wynik:
id/hour 1 2 3
a val1/va2 val1/va2 val1/va2
b val1/va2 val1/va2 val1/va2
c val1/va2 val1/va2 val1/va2

Coś takiego da radę:

select
id,
max(case when hour = 1 then val1/va2 else null end) h1,
max(case when hour = 2 then val1/va2 else null end) h2,
max(case when hour = 3 then val1/va2 else null end) h3
--i tak dalej
from tabela
group by id
Katarzyna Pytlik

Katarzyna Pytlik Zespół Rozwoju
Aplikacji, CBB Call
Center

Temat: [MsSQL] grupowanie danych - Pivot

Tak to ja sobie napisałam, myślałam, że może lepiej/szybciej byłoby przez pivot :)
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: [MsSQL] grupowanie danych - Pivot

Ja ostatnio coś podobnego pisałem na plpgsql :)
Z twarzy podobny zupełnie do nikogo...



Wyślij zaproszenie do