Brauche Unterstützung bei weiteren Spalten in einer Ansicht

Tekila

Neuer Benutzer
Beiträge
2
Hallo Forum-User,

ich benötige für eine SQL Ansicht eure Hilfe, da ich selbst nur SQL Anfängerkenntnisse habe.
Es ist mein erster Eintrag hier, falls ich hier noch weitere Infos nenne soll, sagt mir bitte Bescheid.

Es geht um eine Korrektur-Berechnung die für eine Mengenmeldung pro Standort errechnet werden soll.

Die beiden Tabellen aus denen die Daten kommen sind:
1. t_I_AT mit 4 Spalten:
JahrMonatTag --> 20130101, 20130102 ...,
WTag ---> Mo, Di, Mi ....,
Plan-Tag --> 0 und 1,
ProfitCenter --> 5stellige Nummer

2. t_I_TMELD mit 4 Spalten:
JahrMonatTag (siehe oben)
Scanart --> 1,2,5,...
ProfitCenter --> 5stellige Nummer
Ist-Wert --> Mengenwert

In der Ansicht die ich definieren soll hab ich bis jetzt 6 Spalten (ein Kollege hat mir schon etwas geholfen):
Tag, Anzahl_Tage, profitcenter, scanart, Ist_Wert, Schnitt --> (weitere Infos im gleich folgenden Code)

Code:
USE [DPD Reporting dev]
GO
/****** Objekt:  View [dbo].[v_P_TM_Korrektur]    Skriptdatum: 08/16/2013 13:44:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
ALTER VIEW [dbo].[v_P_TM_Korrektur]
AS
 
SELECT
        case when at.wtag = 'Sa' then 'Fr'else
            case when at.wtag = 'So' then 'Fr' else
                at.wtag
        end end Tag
        ,count(at.wtag) Anzahl_Tage
        ,tm.profitcenter
        ,tm.scanart
        ,sum(tm.[IST-Wert]) Ist_Wert
        ,sum(tm.[IST-Wert])/count(at.wtag) Schnitt
   
       
FROM [t_I_TMELD] as TM
 
left outer join t_I_AT as AT on tm.[JahrMonatTag] = at.[JahrMonatTag] and tm.profitcenter = at.profitcenter
 
where at.[plan-tag] = 1 and tm.[Scanart]=5 --or tm.[Scanart]=1
 
group by at.wtag, tm.profitcenter, tm.scanart



Ziel der Ansicht ist es das ich 2 weitere Spalten noch in der Ansicht haben will:

Spalte 7 (Gesamtmenge): Soll die Summe aus aus den Ist_Wert Mengen für die 5 Tage (Mo bis Fr) sein (für das jeweilige profitcenter und die scanart)
Spalte 8 (Anteil des Tages an Gesamtmenge): Ergebnis aus Spalte 6 geteilt durch Spalte 7 (in Prozent)
Spalte 9 (Korrekturfaktor): soll folgenden Wert errechnen =(1+(1/5-Spalte 8))

Diesen Korrekturfaktor will ich dann für weitere Berechnungen unserer Mengenmeldung verwenden (dies würde in einem Datenwürfel passieren).

Könnt ihr mir hierbei helfen?:)
Vielen Dank schon mal.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
Ziel der Ansicht ist es das ich 2 weitere Spalten noch in der Ansicht haben will:

Spalte 7 (Gesamtmenge): Soll die Summe aus aus den Ist_Wert Mengen für die 5 Tage (Mo bis Fr) sein (für das jeweilige profitcenter und die scanart)
Spalte 8 (Anteil des Tages an Gesamtmenge): Ergebnis aus Spalte 6 geteilt durch Spalte 7 (in Prozent)
Spalte 9 (Korrekturfaktor): soll folgenden Wert errechnen =(1+(1/5-Spalte 8))

Diesen Korrekturfaktor will ich dann für weitere Berechnungen unserer Mengenmeldung verwenden (dies würde in einem Datenwürfel passieren).

Könnt ihr mir hierbei helfen?:)
Vielen Dank schon mal.

Bitte verwende Code-Blöcke zum formatieren, wie das geht steht in der Hilfe.

Für die Spalte 7: ich weiß nicht, ob M$SQL sowas kann wie sum(...) over (partition by ...), in der sum() summierst Du, was zu summieren ist und in partition by verwendest Du Deinen Wochentag. Dieser ist übrigens so in der Form redundant, da man ihn aus dem Datum berechnen kann.

Der Rest ist ja eher trivial ...
 

Tekila

Neuer Benutzer
Beiträge
2
Bitte verwende Code-Blöcke zum formatieren, wie das geht steht in der Hilfe.

Hallo akretschmer, vielen Dank für ihre schnelle Antwort.
Die Codeblöcke für die beiden Ausgangstabellen sind:
Code:
/****** Objekt:  Table [dbo].[t_I_AT]    Skriptdatum: 08/16/2013 15:29:09 ******/
 
CREATE TABLE [dbo].[t_I_AT](
    [JahrMonatTag] [int] NULL,
    [WTag] [char](2) NULL,
    [Plan-Tag] [int] NULL,
    [ProfitCenter] [char](5) NULL
) ON [PRIMARY]

Code:
CREATE TABLE [dbo].[t_I_TMELD](
    [JahrMonatTag] [int] NULL,
    [Scanart] [nvarchar](50) NULL,
    [ProfitCenter] [char](5) NULL,
    [IST-Wert] [decimal](38, 0) NULL
) ON [PRIMARY]

Spalte 7 ist es wo ich auch hänge, die anderen 2 Spalten sollte ich dann hinbekommen.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
Hallo akretschmer, vielen Dank für ihre schnelle Antwort.
Die Codeblöcke für die beiden Ausgangstabellen sind:
Code:
/****** Objekt:  Table [dbo].[t_I_AT]    Skriptdatum: 08/16/2013 15:29:09 ******/
 
CREATE TABLE [dbo].[t_I_AT](
    [JahrMonatTag] [int] NULL,
    [WTag] [char](2) NULL,
    [Plan-Tag] [int] NULL,
    [ProfitCenter] [char](5) NULL
) ON [PRIMARY]

Code:
CREATE TABLE [dbo].[t_I_TMELD](
    [JahrMonatTag] [int] NULL,
    [Scanart] [nvarchar](50) NULL,
    [ProfitCenter] [char](5) NULL,
    [IST-Wert] [decimal](38, 0) NULL
) ON [PRIMARY]

Spalte 7 ist es wo ich auch hänge, die anderen 2 Spalten sollte ich dann hinbekommen.


Also, ich weiß nicht, ob SQLServer die Syntax kann, da gibt es sicherlich Unterschiede. Ich hab vereinfach Deine Tabellen nachgebaut:

Code:
test=*# select * from t1;
  datum    | plan_tag | profit_center
------------+----------+---------------
2013-08-16 | t        | 12345
2013-08-15 | t        | 12345
2013-08-14 | t        | 12345
2013-08-09 | t        | 12345
(4 rows)
 
test=*# select * from t2;
  datum    | scanart | profit_center | ist_wert
------------+---------+---------------+----------
2013-08-16 |      1 | 12345        |        4
2013-08-15 |      1 | 12345        |        4
2013-08-14 |      1 | 12345        |      14
2013-08-09 |      1 | 12345        |      11
(4 rows)

Es fehlt die Spalte wtag, aber die ist berechenbar, daher ein view:

Code:
test=*# \d+ t1v
                          View "public.t1v"
    Column    |      Type      | Modifiers | Storage  | Description
---------------+------------------+-----------+----------+-------------
datum        | date            |          | plain    |
wtag          | double precision |          | plain    |
plan_tag      | boolean          |          | plain    |
profit_center | text            |          | extended |
View definition:
SELECT t1.datum, date_part('dow'::text, t1.datum) AS wtag, t1.plan_tag,
    t1.profit_center
  FROM t1;
 
test=*# select * from t1v;
  datum    | wtag | plan_tag | profit_center
------------+------+----------+---------------
2013-08-16 |    5 | t        | 12345
2013-08-15 |    4 | t        | 12345
2013-08-14 |    3 | t        | 12345
2013-08-09 |    5 | t        | 12345
(4 rows)

Du willst nun für alle Wochentage die Summe aus der t2.ist_wert:

Code:
test=*# select wtag, sum(ist_wert) from t1v left join t2 using(datum) group by wtag;
wtag | sum
------+-----
    5 |  15
    3 |  14
    4 |  4
(3 rows)

Das mit der window-Funktion und dem partition by, was ich erst schrieb, ist quatsch, brauchst hier gar nicht.
 
Oben