Lude: Abfragen auf gleiche Datensatzmengen mit "Where-Filtern"

Beitrag lesen

Hi,

Irgendwie sieht mir das nach einer Stringverknüpfung aus, wie auch immer das in Perl geht.

also, ich habe zum Beispiel sowas (bitte auf die ---MARKE--- schaun)

CREATE
procedure
 BIZ_DATENZUGRIFFE
  @Session_GUID uniqueidentifier,
  @Sortierung nvarchar (32)
 /*
 Gibt eine Liste der Datenzugriffe zurueck, wobei die Sortierungen 'alphabetisch', 'nach_Laufzeit' und
 'nach_DS-Laufzeit' unterstuetzt werden
 --
 Autor:   x
 erstellt am:  17.02.2003
 letzte Aenderung: 12.09.2003
 --
 24.02.2003  Pruefung auf 'Benutzer_GUID' und 'Recht_Name', und Logging erfolgt nun ueber
    'SET_DATENZUGRIFF'
 11.03.2003  Rechteabfrage auf "IsAdmin/IsUser" umgestellt
 23.07.2003  Datenzugriffslogging nun mit 'SET_DATENZUGRIFF_START' und 'SET_DATENZUGRIFF_END'
 09.09.2003  drei Filteroptionen implementiert
 */
as
 begin
 --
 declare
  @Benutzer_GUID  uniqueidentifier,
  @Recht_Name  nvarchar (16),
  @Datenzugriff_GUID uniqueidentifier
 exec
  SET_DATENZUGRIFF_START
   @Session_GUID  = @Session_GUID,
   @Benutzer_GUID  = @Benutzer_GUID  output,
   @Recht_Name  = @Recht_Name  output,
   @Datenzugriff_SP = 'BIZ_DATENZUGRIFFE',
   @Datenzugriff_GUID = @Datenzugriff_GUID output
 --
 if (dbo.IsAdmin(@Recht_Name) = 0)
  begin
  --
  select
   *
  from
   (
   select
    'benutzerspezifisch' as Zugriff,
    Datenzugriff_SP,
    count(*) as Anzahl,
    min(Datenzugriff_Creation_Date) as Zuerst,
    max(Datenzugriff_Creation_Date) as Zuletzt,
    sum(datediff(millisecond,Datenzugriff_Creation_Date,Datenzugriff_Executed_Date)) as Laufzeit,
    sum(datediff(millisecond,Datenzugriff_Creation_Date,Datenzugriff_Executed_Date)) / count(*) as [DS-Laufzeit]
   from
    DATENZUGRIFFE
   where
    (Datenzugriff_Benutzer_GUID = @Benutzer_GUID)
   group by
    Datenzugriff_SP
   union
   select
    'total' as Zugriff,
    Datenzugriff_SP,
    count(*) as Anzahl,
    min(Datenzugriff_Creation_Date) as Zuerst,
    max(Datenzugriff_Creation_Date) as Zuletzt,
    sum(datediff(millisecond,Datenzugriff_Creation_Date,Datenzugriff_Executed_Date)) as Laufzeit,
    sum(datediff(millisecond,Datenzugriff_Creation_Date,Datenzugriff_Executed_Date)) / count(*) as [DS-Laufzeit]
   from
    DATENZUGRIFFE
   group by
    Datenzugriff_SP
   ) [Dummy]
  order by
--
--    ---MARKE---   HIER SCHAUEN BITTE:
--
   case @Sortierung
    when 'alphabetisch' then Datenzugriff_SP
    when 'nach_Laufzeit' then cast(2000000000 - cast(Laufzeit as int) as nvarchar)
    when 'nach_DS-Laufzeit' then cast(2000000000 - cast([DS-Laufzeit] as int) as nvarchar)
   end
  end
 else if (dbo.IsUser(@Recht_Name) = 0)
  begin
  --
  select
   *
  from
   (
   select
    'benutzerspezifisch' as Zugriff,
    Datenzugriff_SP,
    count(*) as Anzahl,
    min(Datenzugriff_Creation_Date) as Zuerst,
    max(Datenzugriff_Creation_Date) as Zuletzt,
    sum(datediff(millisecond,Datenzugriff_Creation_Date,Datenzugriff_Executed_Date)) as Laufzeit,
    sum(datediff(millisecond,Datenzugriff_Creation_Date,Datenzugriff_Executed_Date)) / count(*) as [DS-Laufzeit]
   from
    DATENZUGRIFFE
   where
    (Datenzugriff_Benutzer_GUID = @Benutzer_GUID)
   group by
    Datenzugriff_SP
   ) [Dummy]
  order by
   case @Sortierung
    when 'alphabetisch' then Datenzugriff_SP
    when 'nach_Laufzeit' then cast(2000000000 - cast(Laufzeit as int) as nvarchar)
    when 'nach_DS-Laufzeit' then cast(2000000000 - cast([DS-Laufzeit] as int) as nvarchar)
   end
  end
 --
 exec
  SET_DATENZUGRIFF_END
   @Datenzugriff_GUID = @Datenzugriff_GUID
 --
 end
GO

Und mit dem "CASE-Krempel" bin ich ungluecklich. Vorher hatte ich aber 3 Queries mit identischer Datensatzmenge. Koennte noch zig weitere Beispiele geben.  :~)

Gruss,
Lude