2017-08-29 47 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