2014-08-27 41 views
0

我有這個疑問只選擇1「控制數量」,而無需使用不同

SELECT DISTINCT [CtrlNo] 
,[RefNo] 
,[DealNoCat] 
,[tCustomer].[CustomerName] 
,[tBank].BankName 
,[tFIManagers].[FIName] 
,[DaysOut] 
,[FundDate] 
,[Comment] 
FROM [tContractsInTransit] 
INNER JOIN tFIManagers 
ON tFIManagers.FIManagerID = tContractsInTransit.FIManagerID 
INNER JOIN tBank 
ON tBank.BankID = tContractsInTransit.BankID 
INNER JOIN tCustomer 
ON tCustomer.CustomerID = tContractsInTransit.CustomerID 
WHERE PFX = 'x' 
AND Paid = 'false' 
GROUP BY [CtrlNo] 
,[RefNo] 
,[DealNoCat] 
,[tCustomer].[CustomerName] 
,[tBank].BankName 
,[tFIManagers].[FIName] 
,[DaysOut] 
,[FundDate] 
,[Comment] 
ORDER BY CtrlNo DESC 

然而,這並沒有給我,我想,即使它做什麼,我告訴它做的結果。如果總共有10條記錄,並且其中三條記錄具有相同的CtrlNo,則如果RefNo和DaysOut等其他列之一不相同,則它將顯示所有這三條記錄。我需要顯示DaysOut數量最少的三條記錄。例如,如果DaysOut爲2,6和48,則應顯示帶有2的記錄。有沒有辦法做到這一點?提前致謝。

+0

我們可以有一個SQLFiddle和可視化表示形式來表示想要的輸出結果嗎? – 2014-08-27 19:16:07

+0

在該列上使用Min()並將其從組中刪除或通過窗口函數 – xQbert 2014-08-27 19:20:55

回答

2

假設最近新的sqlserver你可以使用一個窗口類的函數row_number()如下所示:

SELECT ... 
FROM (
    SELECT [CtrlNo] 
    ,[RefNo] 
    ,[DealNoCat] 
    ,[tCustomer].[CustomerName] 
    ,[tBank].BankName 
    ,[tFIManagers].[FIName] 
    ,[DaysOut] 
    ,[FundDate] 
    ,[Comment] 
    , row_number() over (partition by CtrlNo order by DaysOut) as rn 
    FROM [tContractsInTransit] 
    INNER JOIN tFIManagers 
     ON tFIManagers.FIManagerID = tContractsInTransit.FIManagerID 
    INNER JOIN tBank 
     ON tBank.BankID = tContractsInTransit.BankID 
    INNER JOIN tCustomer 
     ON tCustomer.CustomerID = tContractsInTransit.CustomerID 
    WHERE PFX = 'x' 
     AND Paid = 'false' 
) as T 
WHERE rn = 1; 
ORDER BY CtrlNo DESC 
+0

真棒解決方案。這將有很大幫助! – Humpy 2014-08-27 19:42:28

2

您希望不使用DISTINCT關鍵字並使用聚合函數。在這種情況下,MIN。 請注意,「DaysOut」也從的GroupBy子句

SELECT [CtrlNo] 
,[RefNo] 
,[DealNoCat] 
,[tCustomer].[CustomerName] 
,[tBank].BankName 
,[tFIManagers].[FIName] 
,MIN([DaysOut]) as Min_DaysOut 
,[FundDate] 
,[Comment] 
FROM [tContractsInTransit] 
INNER JOIN tFIManagers 
ON tFIManagers.FIManagerID = tContractsInTransit.FIManagerID 
INNER JOIN tBank 
ON tBank.BankID = tContractsInTransit.BankID 
INNER JOIN tCustomer 
ON tCustomer.CustomerID = tContractsInTransit.CustomerID 
WHERE PFX = 'x' 
AND Paid = 'false' 
GROUP BY [CtrlNo] 
,[RefNo] 
,[DealNoCat] 
,[tCustomer].[CustomerName] 
,[tBank].BankName 
,[tFIManagers].[FIName] 
,[FundDate] 
,[Comment] 
ORDER BY CtrlNo DESC 
+0

如果RefNo相同,則此效果很好。但由於它們不同,所以仍然返回具有相同CtrlNo的記錄。但我會在其他項目中記住這一點! – Humpy 2014-08-27 19:36:02

0

如果您使用的是SQL Server 2005或更高版本中刪除:

;WITH cte AS (
SELECT [CtrlNo] 
,[RefNo] 
,[DealNoCat] 
,[tCustomer].[CustomerName] 
,[tBank].BankName 
,[tFIManagers].[FIName] 
,[DaysOut] 
,[FundDate] 
,[Comment] 
,ROW_NUMBER() OVER (Partition BY CtrlNo, ORDER BY DaysOut ASC) AS rn 
FROM [tContractsInTransit] 
INNER JOIN tFIManagers 
ON tFIManagers.FIManagerID = tContractsInTransit.FIManagerID 
INNER JOIN tBank 
ON tBank.BankID = tContractsInTransit.BankID 
INNER JOIN tCustomer 
ON tCustomer.CustomerID = tContractsInTransit.CustomerID 
WHERE PFX = 'x' 
AND Paid = 'false' 
) 
SELECT * FROM cte 
WHERE rn=1 
ORDER BY CtrlNo DESC 
相關問題