Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Pivot dreier Spalten

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von kraeppy, 18 Mai 2017.

  1. kraeppy

    kraeppy Benutzer

    Guten Morgen,

    ich habe eine Tabelle folgender Struktur:

    [SpecificationId], [DeliveryTime_Hourly], [VolumePower], [CDS], [VolumeCoal].

    Zu gewissen Produkten werden Kalkulationen durchgeführt und für einen Tag liegen dann entsprechend 23-25 Werte vor (Zeitumstellung).

    Ich brauche allerdings folgende Struktur.
    [SpecificationId], [DeliveryDate], [Type], [val_1], ..., [val_25]. Wobei in Type dann VolumePower/CDS/VolumeCoal stehen soll.

    Für eine Spalte habe ich es hinbekommen:

    SELECT
    ResultsSetId
    ,SpecificationId
    ,deliverydate
    ,[1] as val_1, ..., [25] as val_25
    FROM
    (

    select
    ResultsSetId
    ,Product
    ,RowNumber + case when RowNumber > 2 and HoursOfDay = 23 then 2 when RowNumber > 3 and HoursOfDay = 24 then 1 else 0 end as RowNumber
    ,HoursOfDay
    ,VolumePower
    ,deliverydate
    from (
    select
    pd.ResultsSetId
    ,SpecificationId
    --,map.ZemdaProductID
    ,ROW_NUMBER() OVER (PARTITION BY pd.ResultsSetId
    ,SpecificationId
    ,maxDisp.DateDeliveryTime
    order by pd.deliverytime,pd.ResultsSetId
    ) as RowNumber
    ,COUNT(*) over (PARTITION BY pd.ResultsSetId
    ,specificationid,
    maxdisp.datedeliverytime
    order by pd.ResultsSetId) as HoursOfDay
    ,VolumePower
    ,deliverydate = CAST(deliverytime as date)
    -- pd.*
    --,maxDisp.*

    from @tblInstruments i
    inner join EOD.PricingResults.PricingResults_Dispatch pd on i.InstrumentName = pd.SpecificationId
    inner join (
    select
    COUNT(DeliveryTime) as NumberOfHours,CAST(DeliveryTime as date) as DateDeliveryTime,SpecificationId as MaxSpecificationId,ResultsSetId
    from
    EOD.PricingResults.PricingResults_Dispatch
    where ResultsSetId = 398
    group by
    CAST(deliverytime as date),SpecificationId,ResultsSetId
    ) maxDisp on (pd.SpecificationId = maxDisp.MaxSpecificationId and CAST(pd.deliverytime as date) = maxDisp.DateDeliveryTime and pd.ResultsSetId = maxDisp.ResultsSetId)

    ) q1
    ) as sourceTable
    PIVOT
    (
    AVG(volumepower)

    --FOR h in
    FOR RowNumber in
    (
    [1],[2],..., [25]
    )
    ) AS PivotTable
    ORDER BY ResultsSetId,SpecificationId,deliverydate

    Die RowNumber und HoursOfDay brauche ich, um festzustellen, ob eine Zeitumstellung an dem Tag erfolgte. Von W->S fehlt natürlich die 3. Stunde, von S->W ist die dritte Stunde doppelt.

    Die Spalten CDS, VolumeCoal brauche ich ebenfalls horizontal, aber weiß nicht, wie ich das in obige Abfrage mit einbringen kann. Dafür habe ich zu wenig mit PIVOT gearbeitet.

    Die einfachste Lösung wäre die Abfrage 3x auszuführen (für VolumePower, CDS und VolumeCoal) und die Ergebnisse mittels UNION ALL zufammenzuführen.
    Aber diesen Ansatz möchte ich ungern verfolgen.

    Danke im Voraus :)

    LG
    kraeppy
     
  2. ukulele

    ukulele Datenbank-Guru

    Wenn mich nicht alles täuscht geht es aber nicht anders, auch nicht mit PIVOT. Wenn ich dich richtig verstehe willst du ja unterschiedliche Werte (VolumePower, CDS, VolumeCoal) in die selben Spalten bringen ob wohl sie eigentlich nichts mit einander zu tun haben, theoretisch nicht mal das selbe Format haben. Das kann man sich nur noch mit gebastel zurecht biegen.
     
Die Seite wird geladen...
Ähnliche Themen - Pivot dreier Spalten
  1. Springstil
    Antworten:
    7
    Aufrufe:
    1.293
  2. dbfbka
    Antworten:
    3
    Aufrufe:
    891
  3. davidlui86
    Antworten:
    10
    Aufrufe:
    1.603
  4. IchHH
    Antworten:
    2
    Aufrufe:
    1.021
  5. FrenchSpirit
    Antworten:
    4
    Aufrufe:
    2.097

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden