如何根据SQL Server中的多个条件获取位置

时间:2019-02-20 14:15:06

标签: sql-server-2008 sql-server-2012

如何基于sql server中的两个表获取所需的输出:

CREATE TABLE [dbo].[Goal](
    [Location] [varchar](50) NULL,
    [Goal] [int] NULL,
    [Month] [date] NULL
)
CREATE TABLE [dbo].[Master](
    [Date] [date] NULL,
    [Employee] [varchar](50) NULL,
    [GP] [int] NULL,
    [Location] [varchar](50) NULL
)
INSERT [dbo].[Goal] ([Location], [Goal], [Month]) VALUES (N'MG Road', 50000, CAST(0xB93D0B00 AS Date))
GO
INSERT [dbo].[Goal] ([Location], [Goal], [Month]) VALUES (N'Madiwala', 60000, CAST(0xB93D0B00 AS Date))
GO
INSERT [dbo].[Goal] ([Location], [Goal], [Month]) VALUES (N'Silk Board', 30000, CAST(0xB93D0B00 AS Date))
GO
INSERT [dbo].[Goal] ([Location], [Goal], [Month]) VALUES (N'BTM', 35000, CAST(0xB93D0B00 AS Date))
GO
INSERT [dbo].[Goal] ([Location], [Goal], [Month]) VALUES (N'MG Road', 55000, CAST(0xBA3D0B00 AS Date))
GO
INSERT [dbo].[Goal] ([Location], [Goal], [Month]) VALUES (N'Madiwala', 65000, CAST(0xBA3D0B00 AS Date))
GO
INSERT [dbo].[Goal] ([Location], [Goal], [Month]) VALUES (N'Silk Board', 35000, CAST(0xBA3D0B00 AS Date))
GO
INSERT [dbo].[Goal] ([Location], [Goal], [Month]) VALUES (N'BTM', 35000, CAST(0xBA3D0B00 AS Date))
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x283E0B00 AS Date), N'Ram', 2000, N'MG Road')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x283E0B00 AS Date), N'Ram', 1800, N'Silk Board')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x293E0B00 AS Date), N'Sami', 15000, N'BTM')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2A3E0B00 AS Date), N'Ram', 2500, N'Silk Board')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2A3E0B00 AS Date), N'Ram', 2500, N'MG Road')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x293E0B00 AS Date), N'Sami', 2000, N'BTM')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2A3E0B00 AS Date), N'Sami', 19000, N'Madiwala')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2E3E0B00 AS Date), N'Ram', 30000, N'MG Road')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2E3E0B00 AS Date), N'Ram', 30000, N'Madiwala')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2F3E0B00 AS Date), N'Ram', 25000, N'Madiwala')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2E3E0B00 AS Date), N'Sami', 20000, N'BTM')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2E3E0B00 AS Date), N'Sami', 15000, N'Silk Board')
GO
INSERT [dbo].[Master] ([Date], [Employee], [GP], [Location]) VALUES (CAST(0x2F3E0B00 AS Date), N'Sami', 15000, N'Silk Board')

基于上述数据,我希望输出如下:

Employe |Location   |TotalGP|Month Goal |Goal %
Ram |MG Road    |3800   |50000          |7.6
Ram |MG Road    |5000   |50000          |10
Ram |Madiwala   |60000  |65000          |92.30769231
Sami    |Madiwala   |17000  |60000          |28.33333333
Sami    |Madiwala   |19000  |60000          |31.66666667
Sami    |Silk board |35000  |35000          |100
sami    |Silk board |15000  |35000          |42.85714286
Ram |Madiwala   |25000  |65000          |38.46153846

我尝试过:

select employee,date,sum(gp)totalgp 
from master 
group by  employee,date 



select * from 
(select date,employee,location,gp,ROW_NUMBER() over (partition by employee,date order by gp desc ) as rn 
from master 
) a
where rn=1

以上查询未给出预期结果。

目标百分比:总gp /每月目标* 100

月目标:应从月目标表中选择月目标,并且该月目标应显示员工在该目标中产生最大GP(GP的总和)的位置的目标。 例如:Ram在MG Road和madiwala都工作过,但他的GP总和更多在MG Road,因此MG road'Goal在4月对阵Ram的表现不佳,但在5月Ram的目标

GP的总定义:

例如,拉姆(Ram)在25-04-18仅在MG公路上获得了2000的奖金,但在同一天的其他位置,他又获得了1800的额外收入,因此我们将为拉姆显示3800,而与位置无关

位置列定义

位置-员工可能在一个或两个位置工作,但您应在此处显示其得分最高Gp(每月总Gp)的位置。 例如:Ram在MG Road和madiwala都工作过,但他的GP总和在MG Road中更多,因此MG Road在4月份被取消,但在5月份,Ram locaion是madiwala

1 个答案:

答案 0 :(得分:0)

使用此查询

select date,employee,sum(gp)as totalgp,max(goal) as monthgoal,cast(sum(gp)* 100.0/max(goal) as float) as 'Goal%'
from goal 
inner join master on master.location=goal.location 
where month(goal.month)=month(master.date)
group by date,employee 

输出是这样的

date       employee                                           totalgp     monthgoal   Goal%
---------- -------------------------------------------------- ----------- ----------- ----------------------
2018-04-25 Ram                                                3800        50000       7.6
2018-04-26 Sami                                               17000       35000       48.571428571428
2018-04-27 Ram                                                5000        50000       10
2018-04-27 Sami                                               19000       60000       31.666666666666
2018-05-01 Ram                                                60000       65000       92.307692307692
2018-05-01 Sami                                               35000       35000       100
2018-05-02 Ram                                                25000       65000       38.461538461538
2018-05-02 Sami                                               15000       35000       42.857142857142

注意: 您必须使两个表的日期格式相同