我这里有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
我想获得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,但是如上所述如何显示它呢?
您必须根据结果集中的需要为多列编写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