none
SSRS & SQL: datetime-Abfrage und Ermittlung der Anzahl der genutzten Monate bei Gruppierung über Artikel möglich? RRS feed

  • Frage

  • Hallo zusammen,

    leider verfolgt mich mal wieder die lieben Zeitformate/Abfrage. Freue mich auf Tipps, da ich nicht weiterkommen:

    1.) Ich sichere einen Lauf der das Importdatum wegsichert und zwar im Format datetime. In Access kann ich das Importdatum mit Uhrzeit über # datetime # abfragen, aber wie geht dies auf dem SQL-Server? Bspw. Importdatum ='2020-09-01 00:0:11.190' oder Importdatum =#2020-09-01 00:00:11.190# erzeugt eine Fehlermeldung

    2.) Div. Artikel haben zig Verbrauchsbuchungen und teilweise in bestimmten Monaten nicht. Die ausgewählten Monate über ALLE Artikel zu ermittelt klappt über das Select gut (s.Abb. SQL unten). Ergänze ich aber nur die Artikelnummer "ANR" beim Select und in der Gruppierung und und als Feld und frage im SSRS-Report über

    =Lookup(Fields!ANR.Value,Fields!ANR.Value, Fields!Anzahl_Monat.Value, "Anzahl_Periodenauswahl"):

    die Anzahl der bebuchten Monate ab, kommt nicht nachvollziehbarer Müll raus. So richtiges Verständnis dafür habe ich nicht, da ich den Datenraum ja vorher eingrenze und er doch damit die 1 nur auf ANR & Monat&Jahr gruppiert durchzählen müsste?

    SELECT
    sum(1) As Anzahl_Monat

    FROM
      Vw_FACT_Lagerbuchungen

    where ANR like  case when @ANR='alle' then ANR else '%' + @ANR + '%' end and Monat in (@Monat) and Jahr in (@Jahr) and ANR_Kennung = case when @Kennung = 'alle' then ANR_Kennung else @Kennung end and PGR in (@PGR) and Buchungsart in (@Buchungsart) and KST1 = case when @KST1 = 'alle' then KST1 else @KST1 end

    group by ( Cast(Vw_FACT_Lagerbuchungen.Jahr as nvarchar(4)) + trim(Cast(Vw_FACT_Lagerbuchungen.Monat as nvarchar(2))))

    Vielen Dank für Erläuterung was im Ansatz falsch ist.

    Gruß

    Chris



    Montag, 7. September 2020 12:22

Alle Antworten

  • Hi,

    poste bitte CREATE TABLE Statements für die Quelltabellen, INSERT INTO Statements für Beispieldaten und dazu bitte noch die gewünschten Ergebnisse, basierend auf exakt den geposteten Beispieldaten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 7. September 2020 12:49
    Moderator
  • Bei Punkt 1 wäre es auch hilfreich zu erfahren, welche Fehlermeldung kommt!

    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Montag, 7. September 2020 13:14
    Beantworter
  • Bei Punkt 1 wäre es auch hilfreich zu erfahren, welche Fehlermeldung kommt!

    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Bei

    SELECT TOP (1000) [ANR]
          ,[Lagerort]
          ,[Bestandsmenge]
          ,[Monat]
          ,[Jahr]
          ,[Importzeit]
      FROM [SST_IFAX].[dbo].[tbl_FACT_Lagerbestand_Monatsinventur]


      where Importzeit = #2020-09-01 00:00:11.190#

    kommt Fehlermeldung:

    Meldung 102, Ebene 15, Status 1, Zeile 10
    Falsche Syntax in der Nähe von "00".

    Das ganze  mit where Importzeit = '2020-09-01 00:00:11.190' 

    ergibt keine Ergebnisse, ob wohl der Feldinhalt aus  Importzeit exakt rauskopiert wurde. 

    Montag, 7. September 2020 13:32
  • zu 2.) das mit sum(1) war Mist......

    Ergänze ich das SQL wie folgt kommt zwar das richtige Ergebnis raus, doch der Lookup unter SRRS lässt keine Aggregation zu, so dass ich das Ergebnis im SQL erzeugen muss aber wie? Ich müsste jetzt nochmal ein weiteres SQL (Dataset) im SQL (bzw. im SSRS-Report) ergänzen, was das Feld Anzahl_Monat (also die 1) summiert.  

    Select

    Vw_FACT_Lagerbuchungen.ANR
    ,( Cast(Vw_FACT_Lagerbuchungen.Jahr as nvarchar(4)) + trim(Cast(Vw_FACT_Lagerbuchungen.Monat as nvarchar(2)))) As Monat
    ,1 as Anzahl_Monat

    where......

    group by .....

    Wie hier der Lösungsansatz in einem SQL bzw. im Reportbuilder, der mir leider als Auswahl nur die Tabellen und Sichten vom SQL-Server anzeigt und nicht den Zugriff auf ein internes Dataset des Report?



    Montag, 7. September 2020 13:42
  • Hi,

    gerne nochmal:

    poste bitte CREATE TABLE Statements für die Quelltabellen, INSERT INTO Statements für Beispieldaten und dazu bitte noch die gewünschten Ergebnisse, basierend auf exakt den geposteten Beispieldaten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 7. September 2020 13:43
    Moderator
  • Erstens mal, die Datumskonvertierung aus String ist Sprachabhängig, deswegen sollte man immer unter Angabe der Formatinformation konvertieren, hier ist es das ODBC Format = Code 120

    select convert(datetime, '2020-09-01 00:00:11.191', 120)

    Dann im Hinterkopf behalten, das Datetime eine maximal Auflösung von 3 Millisekunden hat. Oben habe ich 191 ms angegeben, als Datetime kommt dann doch wieder 190 ms bei raus.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 7. September 2020 14:09
  • Hi,

    gerne nochmal:

    poste bitte CREATE TABLE Statements für die Quelltabellen, INSERT INTO Statements für Beispieldaten und dazu bitte noch die gewünschten Ergebnisse, basierend auf exakt den geposteten Beispieldaten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    ich bin mir nicht genau sicher ob das gemeint ist:

    zu 1.)

    Das Feld Importdatum fülle ich über Visual Studio mittelts feld-update & SQL-Statement über getdate() Die restlichen Felder sind vorher per SQL-Statement über VS per Editor gefüllt. Daher weiß ich nicht wie genau ich was zur Quelltabelle posten soll, da es eigentlich egal sein sollte, da nur das Importdatum abgefragt werden soll.

    SET ANSI_NULLS ON
    GO


    SET QUOTED_IDENTIFIER ON
    GO


    CREATE TABLE [dbo].[tbl_FACT_Lagerbestand_Monatsinventur](
    [ANR] [nvarchar](21) NULL,
    [Lagerort] [int] NULL,
    [Bestandsmenge] [decimal](15, 3) NULL,
    [Monat] [int] NULL,
    [Jahr] [int] NULL,
    [Importzeit] [datetime] NULL
    ) ON [PRIMARY]
    GO

    zu 2.) wäre dies eine Lösung:

    Wie erzeuge ich die Summe die oben genannten "Unterabfrage" , wenn ich das finale SQL über ANR gruppiert und Anzahl_Monat summiert haben möchte.


    Also quasi so wie hier vereinfacht unter MySQL

    https://forum.selfhtml.org/self/2019/aug/05/in-mysql-summe-von-summen-aus-unterabfragen-bilden/1754675


    Montag, 7. September 2020 14:19
  • Bilde mittels Datepart einen neuen Begriff (ggf. per View). Mit diesem kannst du dann auch gruppieren.

    datepart(year, Importzeit) * 100 + datepart(month, Importzeit)

    https://docs.microsoft.com/de-de/sql/t-sql/functions/datepart-transact-sql?view=sql-server-ver15


    Montag, 7. September 2020 18:32