Kombinieren von SQL Abfrage mit SubQuery/SubSelect Abfrage

2SR82

Benutzer
Beiträge
6
Hallo,

folgendes Szenario:

Ich arbeite mit dem SCCM 2012 und möchte eine SQL Abfrage erstellen die mir eine Kombination aus verschiedenen Daten über einen jeweiligen PC + zugeordnetem User + installiertem Windows mit Installationsdatum und installiertem Office + Installationsdatum liefert.

Viele der Daten habe ich inzwischen zusammen, es hapert aber an der Office Version + Installationsdatum.

Das Problem verschärft sich durch die Tatsache, dass der in der Tabelle abgespeicherte Wert für das Installationsdatum teilweise durch verschiedene Office Updates überschrieben wurde. Aus diesem Grund will ich in einer SubQuery nach sämtlichen Office Produkten suchen, den ältesten Wert herausfiltern und diesen in der Hauptabfrage dann anzeigen.

(Nach diversen Tests passt das Datum dann ziemlich genau.)



Zum einen habe ich mir eine SQL Abfrage gebaut welche mir Geräte- ID, Name, User, OS, OS-Datum usw liefert.

Und zum anderen eine separate SubQuery erstellt welche mir das jeweilige Installationsdatum zu einer entsprechenden ResourcenID liefert. (also das älteste Installationsdatum eines Produktes welche mit 'Microsoft Office%' beginnt. Ich weiß das ist nicht optimal, aber ich habe keine andere Möglichkeit gefunden und für meine Zwecke reicht es aus)



Problem ist jetzt diese beiden Abfrage zu verknüpfen.. da komme ich nicht weiter.



Meine Hauptabfrage sieht wie folgt aus:

Code:
SELECT

  tab_System.ResourceID

  ,MIN(tab_System.Name0) as [Device Name]

  ,MIN(tab_System.description0) as [AD Description]

  ,MIN(tab_System.User_Name0) as [Last logged on User]

  ,MIN(v_GS_COMPUTER_SYSTEM.Model0) as [Device Type]

  ,MIN(v_GS_OPERATING_SYSTEM.Caption0) as [Operating System]

  ,MIN(v_GS_OPERATING_SYSTEM.InstallDate0) as [OS InstallDate]

 

FROM

  v_R_System tab_System



LEFT JOIN v_GS_COMPUTER_SYSTEM on v_GS_COMPUTER_SYSTEM.ResourceID = tab_System.ResourceID

LEFT JOIN v_FullCollectionMembership on v_FullCollectionMembership.ResourceID = tab_System.ResourceID

LEFT JOIN v_GS_OPERATING_SYSTEM ON v_GS_OPERATING_SYSTEM.ResourceID = tab_System.ResourceID





/*WHERE

  v_FullCollectionMembership.CollectionID = 'CM000085' AND

  v_GS_WORKSTATION_STATUS.LastHWScan >= Dateadd(day, -40, getdate()) AND*/



GROUP BY tab_System.ResourceID



ORDER BY [Device Name]



Die SubQuery ist folgende:

Code:
SELECT tab_ARPrograms.ResourceID

  ,MIN(tab_ARPrograms.InstallDate0) InstDate

  FROM

  [DB_CM0].[dbo].[v_GS_ADD_REMOVE_PROGRAMS] tab_ARPrograms



  INNER JOIN(

  SELECT [ResourceID]

  ,MIN([InstallDate0]) InstallDate

FROM [DB_CM0].[dbo].[v_GS_ADD_REMOVE_PROGRAMS]

WHERE

  v_GS_ADD_REMOVE_PROGRAMS.[DisplayName0] like 'Microsoft Office%' AND

  v_GS_ADD_REMOVE_PROGRAMS.[InstallDate0] != ''

GROUP BY [ResourceID]

) ss on tab_ARPrograms.ResourceID = ss.ResourceID and tab_ARPrograms.InstallDate0 = ss.InstallDate



  GROUP BY tab_ARPrograms.ResourceID

  ORDER BY tab_ARPrograms.ResourceID



Beide Abfragen für sich funktionieren wie erwartet.

Aber wie füge ich das jetzt zusammen? In der Hauptabfrage benötige ich also zusätzlich "v_GS_ADD_REMOVE_PROGRAMS.[DisplayName0]/[Version]/[InstallDate0]" von der entsprechenden Auswahl die die SubQuery liefert.

(Es müssen in der Hauptabfrage als Ergebnis natürlich ALLE Geräte angezeigt werden, auch wenn dort keine Office Version installiert ist.)



Ich wäre sehr dankbar wenn mir da jemand helfen könnte. Komme einfach nicht weiter an der Stelle.

Falls noch zusätzliche Infos über Aufbau, Struktur oder so benötigt werden einfach Fragen, dann ergänze ich das gerne noch.


Vielen Dank schon mal :)
 
Werbung:
Ich würde sagen in etwa so:
Code:
SELECT

  tab_System.ResourceID

  ,MIN(tab_System.Name0) as [Device Name]

  ,MIN(tab_System.description0) as [AD Description]

  ,MIN(tab_System.User_Name0) as [Last logged on User]

  ,MIN(v_GS_COMPUTER_SYSTEM.Model0) as [Device Type]

  ,MIN(v_GS_OPERATING_SYSTEM.Caption0) as [Operating System]

  ,MIN(v_GS_OPERATING_SYSTEM.InstallDate0) as [OS InstallDate]
 
  ,MIN(tab_ARPrograms.InstallDate0) AS InstDate
 
  ,MIN([InstallDate0]) AS InstallDate

FROM

  v_R_System tab_System

LEFT JOIN v_GS_COMPUTER_SYSTEM on v_GS_COMPUTER_SYSTEM.ResourceID = tab_System.ResourceID

LEFT JOIN v_FullCollectionMembership on v_FullCollectionMembership.ResourceID = tab_System.ResourceID

LEFT JOIN v_GS_OPERATING_SYSTEM ON v_GS_OPERATING_SYSTEM.ResourceID = tab_System.ResourceID

LEFT JOIN [DB_CM0].[dbo].[v_GS_ADD_REMOVE_PROGRAMS] tab_ARPrograms
ON        tab_ARPrograms.ResourceID = tab_System.ResourceID
LEFT JOIN [DB_CM0].[dbo].[v_GS_ADD_REMOVE_PROGRAMS] t
ON        tab_ARPrograms.ResourceID = t.ResourceID
AND        tab_ARPrograms.InstallDate0 = t.InstallDate
AND        t.[DisplayName0] like 'Microsoft Office%'
AND        t.[InstallDate0] != ''

/*WHERE

  v_FullCollectionMembership.CollectionID = 'CM000085' AND

  v_GS_WORKSTATION_STATUS.LastHWScan >= Dateadd(day, -40, getdate()) AND*/

GROUP BY tab_System.ResourceID

ORDER BY [Device Name]
Wobei mir die Struktur noch nicht ganz klar ist, vor allem warum du die Tabelle v_GS_ADD_REMOVE_PROGRAMS zweimal haben willst mit dem selben InstallDate0. Das ergibt eigentlich keinen Sinn, man könnte das also auch einfach streichen und nur einmal joinen.
 
Danke, das hat soweit funktioniert :)

Ja hab auch gemerkt das da noch was doppelt ist. Hab noch ein paar kleine Anpassungen vorgenommen und für meine aktuellen Zwecke reicht das aus.
In Zukunft werde ich das Installationsdatum sowieso gesondert irgendwo abspeichern und dann auslesen. Dann muss ich auch nicht so komische Konstrukte bauen.

Danke nochmal!
 
Ok,

leider hat sich hier doch noch ein Problem ergeben.
Ich brauche noch einen weiteren Wert, Anzahl der Primären Benutzer die an einem Gerät arbeiten.

Stand ist jetzt folgender:

Code:
SELECT
  tab_System.ResourceID
  ,MIN(tab_System.Name0) as [Device Name]
  ,MIN(tab_System.description0) as [AD Description]
  ,MIN(tab_System.User_Name0) as [Last logged on User]
  ,MIN(v_GS_COMPUTER_SYSTEM.Model0) as [Device Type]
  ,MIN(v_GS_OPERATING_SYSTEM.Caption0) as [Operating System]
  ,MIN(v_GS_OPERATING_SYSTEM.InstallDate0) as [OS InstallDate]
  ,MAX(t.DisplayName0) AS [OfficeDisplayName]
  ,MIN(t.Version0) AS [Office Version]
  ,MIN(t.InstallDate0) AS [Office InstallDate]
  ,COUNT(pu.UserResourceID) as [# Primary User]

FROM
  v_R_System tab_System

LEFT JOIN v_GS_COMPUTER_SYSTEM on v_GS_COMPUTER_SYSTEM.ResourceID = tab_System.ResourceID
LEFT JOIN v_FullCollectionMembership on v_FullCollectionMembership.ResourceID = tab_System.ResourceID
LEFT JOIN v_GS_OPERATING_SYSTEM ON v_GS_OPERATING_SYSTEM.ResourceID = tab_System.ResourceID

LEFT JOIN v_GS_ADD_REMOVE_PROGRAMS t
ON        tab_System.ResourceID = t.ResourceID
AND        t.[DisplayName0] like 'Microsoft Office%'
AND        t.[InstallDate0] != ''

LEFT JOIN v_UsersPrimaryMachines pu
ON         pu.MachineID = tab_System.ResourceID


/*WHERE
  v_FullCollectionMembership.CollectionID = 'CM000085' AND
  v_GS_WORKSTATION_STATUS.LastHWScan >= Dateadd(day, -40, getdate()) AND*/

GROUP BY tab_System.ResourceID

ORDER BY [Device Name]
/*ORDER BY [InstallDate]*/

Habe jetzt zuletzt oben das
,COUNT(pu.UserResourceID) as [# Primary User]

und dazu das
LEFT JOIN v_UsersPrimaryMachines pu
ON pu.MachineID = tab_System.ResourceID

eingefügt.

Die Ergebnisse der Spalte sind dann Werte zwischen 0 und ca 8000.
Habe allerdings keine Ahnung wieso. Eigentlich sollten hier Werte zwischen 0 und 10 herauskommen.

wenn ich die Tabelle einzeln mit
Code:
SELECT COUNT([UserResourceID])
      ,[MachineID]
  FROM [DB_CM0].[dbo].[v_UsersPrimaryMachines]

  GROUP BY[MachineID]
abfrage passen die Werte. Warum liefert mir hier Count solchen komischen Werte.
Habe schon alle möglichen Konstellationen probiert und kapiere einfach nicht was ich hier falsch mache.

Wäre super wenn mir da nochmal jemand helfen kann :)
 
Zuletzt bearbeitet:
Durch die ganzen LEFT JOINs dürfte deine UserResourceID in jedem Eintrag zur ResourceID stehen und wenn du die zählst zählst du alle Einträge. Eventuell kommst du mit count(DISTINCT UserResourceID) zum Ziel, das hängt ein bischen von deinen Daten ab.

Du solltest dir in jedem Fall mal zu einer RessourceID das Ergebnis deines Statements ohne GROUP BY anschauen.
 
Werbung:
Hey,

wollte nur nochmal kurz Rückmeldung geben. War ne Woche krank deswegen hat es gedauert bis ich das testen konnte.

Auf jeden Fall funktioniert es mit DISTINCT wie gewünscht.
Leider sind die Ergebnisse nicht so akkurat wie gewünscht, aber dass ist ein SCCM Problem, nicht SQL.

Danke nochmal :)
 
Zurück
Oben