如何获得申请比例

问题描述 投票:1回答:1

我这里有3张桌子。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Application]
(
    [ApplicationId] [int] IDENTITY(1,1) NOT NULL,
    [BlockId] [bigint] NOT NULL,
    [AppliedOn] [datetime] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Block]
(
    [BlockId] [int] IDENTITY(1,1) NOT NULL,
    [BlockCode] [varchar](15) NOT NULL,
    [LocCode] [varchar](15) NOT NULL,
    [CropType] [char](1) NOT NULL,
    [AppYear] [int] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Recommendation]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [BlockId] [int] NOT NULL,
    [MthApp] [datetime] NULL,
    [FertilizerId] [int] NULL,
    [Bag] [int] NULL,
    [ApplicationId] [int] NULL
) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].[Application] ON 
GO

INSERT INTO [dbo].[Application] ([ApplicationId], [BlockId], [AppliedOn]) 
VALUES (1, 1, CAST(N'2019-10-01T00:00:00.000' AS DateTime))

INSERT INTO [dbo].[Application] ([ApplicationId], [BlockId], [AppliedOn]) 
VALUES (2, 2, CAST(N'2019-10-01T00:00:00.000' AS DateTime))
GO

SET IDENTITY_INSERT [dbo].[Application] OFF
GO

SET IDENTITY_INSERT [dbo].[Block] ON 
GO

INSERT INTO [dbo].[Block] ([BlockId], [BlockCode], [LocCode], [CropType], [AppYear]) 
VALUES (1, N'BC010', N'001', N'M', 2019)
GO

INSERT INTO [dbo].[Block] ([BlockId], [BlockCode], [LocCode], [CropType], [AppYear]) 
VALUES (2, N'BC010', N'001', N'F', 2019)
GO

INSERT INTO [dbo].[Block] ([BlockId], [BlockCode], [LocCode], [CropType], [AppYear]) 
VALUES (3, N'BC022', N'001', N'M', 2019)
GO

INSERT INTO [dbo].[Block] ([BlockId], [BlockCode], [LocCode], [CropType], [AppYear]) 
VALUES (4, N'BC033', N'001', N'M', 2019)
GO

INSERT INTO [dbo].[Block] ([BlockId], [BlockCode], [LocCode], [CropType], [AppYear]) 
VALUES (5, N'BC010', N'002', N'F', 2019)
GO

INSERT INTO [dbo].[Block] ([BlockId], [BlockCode], [LocCode], [CropType], [AppYear]) 
VALUES (6, N'BC044', N'002', N'M', 2019)
GO

SET IDENTITY_INSERT [dbo].[Block] OFF
GO

SET IDENTITY_INSERT [dbo].[Recommendation] ON 
GO

INSERT INTO [dbo].[Recommendation] ([Id], [BlockId], [MthApp], [FertilizerId], [Bag], [ApplicationId]) 
VALUES (1, 1, CAST(N'2019-10-01T00:00:00.000' AS DateTime), 11, 100, NULL)
GO
INSERT INTO [dbo].[Recommendation] ([Id], [BlockId], [MthApp], [FertilizerId], [Bag], [ApplicationId]) 
VALUES (2, 1, CAST(N'2019-10-01T00:00:00.000' AS DateTime), 12, 30, NULL)
GO
INSERT INTO [dbo].[Recommendation] ([Id], [BlockId], [MthApp], [FertilizerId], [Bag], [ApplicationId]) 
VALUES (3, 1, CAST(N'2019-10-01T00:00:00.000' AS DateTime), 24, 10, 1)
GO
INSERT INTO [dbo].[Recommendation] ([Id], [BlockId], [MthApp], [FertilizerId], [Bag], [ApplicationId]) 
VALUES (4, 2, CAST(N'2019-10-01T00:00:00.000' AS DateTime), 11, 80, 2)
GO

SET IDENTITY_INSERT [dbo].[Recommendation] OFF
GO

这种关系是这样的

LocCode 1----M Block 1----M Recommendation 1----1 Application
  • 1 LocCode将有很多块
  • 1个区块将有很多建议
  • 1条建议将只有1条申请

我想获得LocCode的应用程序/建议的百分比* 100,按cropType和AppYear分组。

如果我应用此查询

select *
from block b 
join Recommendation r on r.BlockId = b.BlockId
left join Application a on a.ApplicationId = r.ApplicationId
-- where b.CropType ='M' and b.loccode = '001' and b.AppYear = 2019

我会得到this

但是我实际上想要类似this的记录,反之亦然。查询如何?

我实际上遇到了这个查询

select 100. * count(*) / sum(count(*)) over () 
from block b 
join Recommendation r on r.BlockId = b.BlockId
left join Application a on a.ApplicationId = r.ApplicationId
where b.CropType ='M' and b.loccode = '001' and b.AppYear = 2019
group by a.ApplicationId

我只能得到这样的百分比,我知道应用了33.33,但是如上所述如何显示它呢?

sql join count sum percentage
1个回答
0
投票

您必须根据结果集中的需要为多列编写GROUP BY。下面的代码有效。我已经通过应用CASE逻辑处理了除以零错误。

SELECT b.LocCode, b.CropType, b.AppYear, CASE WHEN count(r.blockId) = 0 THEN 0 ELSE COUNT(a.blockId) * 100 / count(r.blockId) end as percentage
FROM block as b
LEFT JOIN Recommendation as r
on r.BlockId = b.BlockId
LEFT JOIN application as a
on a.BlockId = b.BlockId
group by b.LocCode, b.CropType, b.AppYear
© www.soinside.com 2019 - 2024. All rights reserved.