Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL server中查找与max列匹配的值_Sql_Sql Server_Max_Case Statement - Fatal编程技术网

在SQL server中查找与max列匹配的值

在SQL server中查找与max列匹配的值,sql,sql-server,max,case-statement,Sql,Sql Server,Max,Case Statement,我有一个表,其中包含“最大月数”列,如下所示: Category MaxMonths Title X 3 Beginner-1 X 6 Intermediate-1 X 12 Avance-1 X 999 Master-1 Y 3 Beginner-2 Y 6

我有一个表,其中包含“最大月数”列,如下所示:

   Category  MaxMonths Title
    X         3         Beginner-1
    X         6         Intermediate-1
    X         12        Avance-1
    X         999       Master-1
    Y         3         Beginner-2
    Y         6         Intermediate-2
    Y         12        Avance-2
    Y         999       Master-2
  User #months   Category
    A     1        X
    B     5        X
    C     6        y
    D     12       y
    E     15       X  
我还有另一个表,其中有一个月数列,如下所示:

   Category  MaxMonths Title
    X         3         Beginner-1
    X         6         Intermediate-1
    X         12        Avance-1
    X         999       Master-1
    Y         3         Beginner-2
    Y         6         Intermediate-2
    Y         12        Avance-2
    Y         999       Master-2
  User #months   Category
    A     1        X
    B     5        X
    C     6        y
    D     12       y
    E     15       X  
我如何编写一个案例陈述,根据第二个表中的#月显示用户的标题


例如,它需要显示用户A的标题是初学者-1。我可以使用category列连接表,但很难将#months与maxMonths匹配此查询查找适用于每个用户/类别的maxMonths:

select t2.[User], t2.category, min(t1.maxMonths) as maxMonths
from table1 t1 
    inner join table2 t2 on t1.category = t2.category
        and t1.maxMonths >= t2.months
group by t2.[User], t2.category
然后,您可以轻松获得标题:

select r1.[User], r2.Title
from
(select t2.[User], t2.category, min(t1.maxMonths) as maxMonths
from table1 t1 
    inner join table2 t2 on t1.category = t2.category
        and t1.maxMonths >= t2.months
group by t2.[User], t2.category) r1
inner join table1 r2 on r2.category = r1.category and r2.maxMonths = r1.maxMonths;

此查询查找适用于每个用户/类别的maxMonths:

select t2.[User], t2.category, min(t1.maxMonths) as maxMonths
from table1 t1 
    inner join table2 t2 on t1.category = t2.category
        and t1.maxMonths >= t2.months
group by t2.[User], t2.category
然后,您可以轻松获得标题:

select r1.[User], r2.Title
from
(select t2.[User], t2.category, min(t1.maxMonths) as maxMonths
from table1 t1 
    inner join table2 t2 on t1.category = t2.category
        and t1.maxMonths >= t2.months
group by t2.[User], t2.category) r1
inner join table1 r2 on r2.category = r1.category and r2.maxMonths = r1.maxMonths;

使用以下查询

Select 
    T1.User, 
    T2.Title 
from table1 T1 
inner join table2 T2 on t1.category = t2.category
Where t2.MaxMonthes = (
    Select 
        min(MaxMonthes) 
    from table1 T3 
    Where T3.maxmonthes >= T2.[#months] 
    and T2.category = T3.category
)

使用以下查询

Select 
    T1.User, 
    T2.Title 
from table1 T1 
inner join table2 T2 on t1.category = t2.category
Where t2.MaxMonthes = (
    Select 
        min(MaxMonthes) 
    from table1 T3 
    Where T3.maxmonthes >= T2.[#months] 
    and T2.category = T3.category
)

以下是临时表中的示例数据:

CREATE TABLE #title(
    category CHAR(1)
    ,maxMonths INT
    ,title VARCHAR(25)
)
GO

CREATE TABLE #months(
    [user] CHAR(1)
    ,months INT
    ,category CHAR(1)
)
GO

INSERT INTO #title VALUES 
('X',3  ,'Beginner-1')
,('X',6  ,'Intermediate-1')
,('X',12 ,'Avance-1')
,('X',999,'Master-1')
,('Y',3  ,'Beginner-2')
,('Y',6  ,'Intermediate-2')
,('Y',12 ,'Avance-2')
,('Y',999,'Master-2')
GO

INSERT INTO #months VALUES 
('A',1 ,'X')
,('B',5 ,'X')
,('C',6 ,'y')
,('D',12,'y')
,('E',15,'X')  
GO
您可以使用以下查询来获取所需内容

SELECT
    #months.[user]
    ,#months.months
    ,#months.category
    ,#title.title
FROM #title
INNER JOIN #months ON #title.category = #months.category
WHERE #title.maxmonths = (
    SELECT 
        MIN(maxmonths)
    FROM #title
    WHERE maxmonths >= #months.months
)
解释:嵌套查询会将结果限制为仅包含maxMonths略高于实际月份的标题

注意事项:我不确定你是想让months=maxMonth的比赛上升一个级别,还是让它下降一个级别。我假设是后者,不过您可以通过将嵌套查询中的
=
更改为


此外,还使用了
USER
作为列名。您应该避免在生产环境中使用它,因为它是一个保留关键字。

以下是临时表中的示例数据:

CREATE TABLE #title(
    category CHAR(1)
    ,maxMonths INT
    ,title VARCHAR(25)
)
GO

CREATE TABLE #months(
    [user] CHAR(1)
    ,months INT
    ,category CHAR(1)
)
GO

INSERT INTO #title VALUES 
('X',3  ,'Beginner-1')
,('X',6  ,'Intermediate-1')
,('X',12 ,'Avance-1')
,('X',999,'Master-1')
,('Y',3  ,'Beginner-2')
,('Y',6  ,'Intermediate-2')
,('Y',12 ,'Avance-2')
,('Y',999,'Master-2')
GO

INSERT INTO #months VALUES 
('A',1 ,'X')
,('B',5 ,'X')
,('C',6 ,'y')
,('D',12,'y')
,('E',15,'X')  
GO
您可以使用以下查询来获取所需内容

SELECT
    #months.[user]
    ,#months.months
    ,#months.category
    ,#title.title
FROM #title
INNER JOIN #months ON #title.category = #months.category
WHERE #title.maxmonths = (
    SELECT 
        MIN(maxmonths)
    FROM #title
    WHERE maxmonths >= #months.months
)
解释:嵌套查询会将结果限制为仅包含maxMonths略高于实际月份的标题

注意事项:我不确定你是想让months=maxMonth的比赛上升一个级别,还是让它下降一个级别。我假设是后者,不过您可以通过将嵌套查询中的
=
更改为

此外,还使用了
USER
作为列名。您应该避免在生产环境中使用它,因为它是一个保留关键字