2017-07-07 4 views
1

mit diesem ein wenig Probleme, ...SQL Server - Werte, multipliziert mit verbinden

Die summierten gruppierte Spalte TotalStoreVisitTime aufgrund links multipliziert wird weiter nach unten kommen. Ich habe Unterabfragen versucht, kann sie aber nicht erfolgreich implementieren. Jemand anderes, mit dem ich gesprochen habe, hat dies mit Cursoren usw. versucht, aber es scheint zu kompliziert zu sein.

SELECT t1.StaffName     AS "Staff Name" 
     ,MIN(t1.ManagerName)   AS "Manager" 
     ,t1.Name      AS "Store" 
     ,t1.StartDate    AS "Date" 
     ,SUM(t1.TotalStoreVisitTime) AS "Total Store Time" -- this value gets multiplied by the LEFT JOIN further down. 
     ,SUM(t2.TotalClientTime)  AS "Total Client Time" 
FROM t1 
     LEFT JOIN t2 
       ON t1.StaffName = 
       t2.StaffName 
       AND t1.Name = t2.Store 
       AND t1.StartDate = 
        t2.StartDate 
WHERE t1.StartDate >= DATEADD(DAY, -7, GETDATE()) 
GROUP BY t1.StaffName 
      ,t1.Name 
      ,t1.StartDate 
ORDER BY t1.StartDate DESC; 

Der Ausgang ist wie folgt:

| Staff Name | Manager | Store | Date | Total Store Time | Total Client Time | 
|------------|------------|------------|-----------|------------------|-------------------| 
| John Smith | Jane Smith | Test Store | 6/07/2017 |  25.899996 |   4.033332 | 

Die gewünschte Ausgabe dieses (dh mit Gesamtspeicherzeit nur die Zeilen aus t1 Summieren und nicht durch die Anzahl der Zeilen in T2 multipliziert wird) ist:

| Staff Name | Manager | Store | Date | Total Store Time | Total Client Time | 
|------------|------------|------------|-----------|------------------|-------------------| 
| John Smith | Jane Smith | Test Store | 6/07/2017 |   4.316666 |   4.033332 | 
+0

Geben Schema von zwei Tabellen und die Beispieldaten ... weiter zu analysieren ... – JayaPrakash

Antwort

0

Sub-Abfrage ist gut zu gehen:

SELECT t1.StaffName  AS "Staff Name" 
    ,MIN(t1.ManagerName) AS "Manager" 
    ,t1.Name    AS "Store" 
    ,t1.StartDate  AS "Date" 
    ,(SELECT SUM(t3.TotalStoreVisitTime) 
    FROM TableA t3 
    WHERE t1.StaffName = t3.StaffName 
     AND t1.Name = t3.Name 
     AND t1.StartDate = t3.StartDate) AS "Total Store Time" -- compare with primary key 
    ,SUM(t2.TotalClientTime)  AS "Total Client Time" 
FROM TableA t1 
LEFT JOIN TableB t2 
ON t1.StaffName =t2.StaffName 
AND t1.Name = t2.Store 
AND t1.StartDate = t2.StartDate 
WHERE t1.StartDate >= DATEADD(DAY, -7, GETDATE()) 
GROUP BY t1.StaffName, t1.Name, t1.StartDate 
ORDER BY t1.StartDate DESC; 
+0

Danke für die Hilfe mit der Unterabfrage. Es stellt sich heraus, dass die Verwendung der Unterabfrage für TotalStoreVisitTime dann die Summe von TotalClientTime mit der Anzahl der Zeilen in der linken Tabelle multipliziert. Um dies zu beheben, habe ich eine andere Unterabfrage verwendet, um die Summe von TotalClientTime auszuwählen (mit t4.) Und dann den LEFT JOIN weiter unten loszuwerden. –

0

Sie müssen vor dem join aggregieren. Ich denke, das könnte funktionieren:

SELECT t1.StaffName     AS "Staff Name" , 
     t1.Manager     AS "Manager", 
     t1.Name      AS "Store" , 
     t1.StartDate    AS "Date" , 
     t1.tot AS "Total Store Time", -- this value gets multiplied by the LEFT JOIN further down. 
     SUM(t2.TotalClientTime)  AS "Total Client Time" 
FROM (SELECT t1.StaffName, t1.Name, t1.StartDate, 
      SUM(t1.TotalStoreVisitTime) as tot, 
      MIN(t1.ManagerName) as manager 
     FROM t1 
     WHERE t1.StartDate >= DATEADD(DAY, -7, GETDATE()) 
    ) t1 LEFT JOIN 
    t2 
    ON t1.StaffName = t2.StaffName AND 
     t1.Name = t2.Store AND 
     t1.StartDate = t2.StartDate 
GROUP BY t1.StaffName, t1.Name, t1.StartDate 
ORDER BY t1.StartDate DESC;