[英]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.