2017-08-29 94 views
0

我有一個表IdentifySlot像這樣的數據:限制在SQL Server表中的行

Cname TotalEmpty 
------------------ 
CName1  4 
CName2  3 
CName3  1 
CName4  7 
CName5  30 
CName6  36 

,我也有一個ActualSlot表:

CName AppDate  RankNumber 
-------------------------------- 
CName1 05/01/2018  1 
CName1 05/01/2018  2 
CName1 16/02/2018  3 
CName2 05/01/2018  1 
CName2 19/01/2018  2 
CName2 17/02/2018  3 
CName2 18/02/2018  4 
CName2 19/02/2018  5 
CName2 20/02/2018  6 
CName3 15/01/2018  1 
CName3 16/02/2018  2 
CName3 21/02/2018  3 
CName4 12/01/2018  1 
CName4 02/02/2018  2 
CName5 14/01/2018  1 
CName5 02/02/2018  2 
CName5 22/02/2018  3 
CName6 26/01/2018  1 
CName6 09/02/2018  2 
CName6 09/02/2018  3 
Cname+n date+n   n 

我想限制這樣的行:我想使用IdentifySlot表中的TotalEmpty列,並將ActualSlot表中的行限制爲僅限於

  • 4行用於CName1,
  • 3行爲CName2
  • 1行用於CName3
  • 7行用於CName4和CName5
  • 30行等等...

ActualSlot表。

這是我到目前爲止已經試過:

SELECT TOP (b.TotalEmpty) 
    ApptID, CName, AppDate 
FROM 
    ActualSlot a 
LEFT JOIN 
    ActualSlot b ON a.CName = b.CName 
WHERE 
    b.CName = 'CName1' 

UNION 

SELECT TOP (b.TotalEmpty) 
    ApptID, CName, AppDate 
FROM 
    ActualSlot a 
LEFT JOIN 
    ActualSlot b ON a.CName = b.CName 
WHERE 
    b.CName = 'CName2' 

UNION 

SELECT TOP (b.TotalEmpty) 
    ApptID, CName, AppDate 
FROM 
    ActualSlot a 
LEFT JOIN 
    ActualSlot b ON a.CName = b.CName 
WHERE 
    b.CName = 'CName3' 

,但它不工作。我想我需要編寫一個存儲過程來循環一次,而不是工會的「CNAME記錄」一...任何幫助表示讚賞感謝

+0

你可以使用一個跨應用或類似的東西,如果你想要的。例如'SELECT b。* FROM IdentifySlot AS CROSS APPLY(SELECT TOP(a.TotalEmpty)* FROM ActualSlot AS b WHERE b.CName = a.CName)AS b;' – ZLK

+0

是實際槽位表中的一列嗎? –

+0

是ranknumber是一列 – jk1844

回答

0

您可以在子這樣的查詢使用ROW_NUMBER:

SELECT CName, AppDate, RankNumber FROM (
    ApptID, 
    CName, 
    AppDate, 
    ROW_NUMBER() OVER(PARTITION BY Cname ORDER BY AppDate) RankNumber 
    From ActualSlot 
) a 
Left Join ActualSlot b on a.CName= b.CName 
WHERE b.CName = 'CName1' 
AND RankNumber <= b.TotalEmpty 
UNION ALL 
.. 
0

你在尋找這樣的結果嗎?

SELECT b.totalempty, 
     a.cname, 
     a.appdate 
    FROM actualslot a 
INNER JOIN identifyslot b 
    ON a.cname = b.cname 
    AND a.ranknumber <= b.totalempty 

結果

totalempty cname appdate  ranknumber 
4   CName1 2018-01-05 1 
4   CName1 2018-01-05 2 
4   CName1 2018-02-16 3 
3   CName2 2018-01-05 1 
3   CName2 2018-01-19 2 
3   CName2 2018-02-17 3 
1   CName3 2018-01-15 1 
7   CName4 2018-01-12 1 
7   CName4 2018-02-02 2 
30   CName5 2018-01-14 1 
30   CName5 2018-02-02 2 
30   CName5 2018-02-22 3 
36   CName6 2018-01-26 1 
36   CName6 2018-02-09 2 
36   CName6 2018-02-09 3