簡體   English   中英

SQL查詢擊穿

[英]Sql Query to breakdown

我在SQL Server中具有以下表結構

交易

 ---------------------------------------------------------------------
 **ID | FromEmployeeID | ToEmployeeID | OutgoingTotal | IncomingTotal**|
 ---------------------------------------------------------------------
   1  |      10        |     20       |       10      |       50
   2  |      11        |     10       |       20      |       40    

我需要按employeeID將數據轉換到另一個表Summary ,就像從雇員到雇員的事務開始一樣,我必須在摘要中作為每個雇員的兩條記錄(一條用於傳出,一條用於接收)記錄為摘要

總結

 ---------------------------------------------------------------------
 **ID | EmployeeID | outgoingcount| incomingcount | OutgoingTotal| IncomingTotal**|
 ---------------------------------------------------------------------
   1  |      10    |     1        |       1       |   10         |  50
   2  |      20    |     0        |       1       |   0          |  50
   3  |      11    |     1        |       0       |   0          |  40   

我也有員工表,其中有員工ID和其他員工信息。

如何做到這一點?

我將使用臨時表,首先插入您的員工ID,然后在單獨的查詢中更新計數和總和。 還沒有測試過,但是您可以嘗試以下操作:

CREATE TABLE #Summary (
  ID INT IDENTITY(1,1) NOT NULL,
  EmployeeID INT NOT NULL,
  OutgoingCount INT NOT NULL,
  IncomingCount INT NOT NULL,
  OutgoingTotal INT NOT NULL,
  IncomingTotal INT NOT NULL
)

--Get all the distinct 'from' employee IDs
INSERT INTO #Summary( EmployeeID )
SELECT DISTINCT FromEmployeeID FROM Transaction;

--Get the rest of the employee ids, except for those that have already been added to the table
INSERT INTO #Summary( EmployeeID )
SELECT DISTINCT ToEmployeeID FROM Transaction t
LEFT JOIN #Summary s ON s.EmployeeID = t.ToEmployeeID
WHERE s.EmployeeID IS NULL

--Update the summary table with the outgoing results
UPDATE s
SET OutgoingCount = e.OutgoingCount,
    OutgoingTotal = e.OutgoingTotal
FROM
  #Summary s
  JOIN (SELECT FromEmployeeID AS EmployeeID, COUNT(OutgoingTotal) AS OutgoingCount, SUM(OutgoingTotal) AS OutgoingTotal FROM Transaction t WHERE t.FromEmployeeID = s.EmployeeID GROUP BY t.FromEmployeeID) e ON e.EmployeeID = s.EmployeeID

--Repeat the process for incoming results
UPDATE s
SET IncomingCount = e.IncomingCount,
    IncomingTotal = e.IncomingTotal
FROM
  #Summary s
  JOIN (SELECT ToEmployeeID AS EmployeeID, COUNT(IncomingTotal) AS IncomingCount, SUM(IncomingTotal) AS IncomingTotal FROM Transaction t WHERE t.ToEmployeeID = s.EmployeeID GROUP BY t.ToEmployeeID) e ON e.EmployeeID = s.EmployeeID

--End the end, select your results
SELECT
  *
FROM
  #Summary

正如@Nithin所說,在您的示例中,總數未匯總。

WITH AllEmployees AS (
    SELECT DISTINCT EmployeeId
    FROM [Transaction]
    CROSS APPLY (
        VALUES (FromEmployeeID)
              ,(ToEmployeeID)
    ) AS T(EmployeeId)
)
SELECT EmployeeId
      ,Outgoing.Records AS outgoingcount
      ,Incoming.Records AS incomingcount 
      ,COALESCE(Outgoing.Total, 0) AS OutgoingTotal
      ,COALESCE(Incoming.Total, 0) AS IncomingTotal
FROM AllEmployees
     CROSS APPLY (
          SELECT COUNT(1) AS Records
                ,SUM(OutgoingTotal) As Total
          FROM [Transaction]
          WHERE [Transaction].FromEmployeeID = AllEmployees.EmployeeId
     ) AS Outgoing
     CROSS APPLY (
          SELECT COUNT(1) AS Records
                ,SUM(IncomingTotal) AS Total
          FROM [Transaction]
          WHERE [Transaction].ToEmployeeID = AllEmployees.EmployeeId
     ) AS Incoming

根據我的理解,我已經寫了一個查詢:

SELECT ISNULL(OutGoing.FromEmployeeID,Incoming.ToEmployeeID) EmployeeID,
       ISNULL(OutgoingCount,0) OutgoingCount,
       ISNULL(IncomingCount,0) IncomingCount,
       ISNULL(OutgoingTotal,0) OutgoingTotal,
       ISNULL(IncomingTotal,0) IncomingTotal
FROM (
        SELECT FromEmployeeID,
               COUNT(*) OutgoingCount,
               SUM(OutgoingTotal) OutgoingTotal
        FROM CallLogs
        GROUP BY FromEmployeeID
      ) OutGoing
FULL OUTER JOIN 
      (
        SELECT ToEmployeeID,
               COUNT(*) IncomingCount ,
               SUM(IncomingTotal) IncomingTotal
        FROM CallLogs
        GROUP BY ToEmployeeID
      ) Incoming
ON OutGoing.FromEmployeeID = Incoming.ToEmployeeID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM