Sql 查询以描述的格式检索数据
Sql query to retrieve data in described format
正在努力将此查询概念化。任何帮助将不胜感激。
数据集
Table:审计
Date |Action |PackageId
1/1/15 |Active |1
1/2/15 |DeActive|1
11/3/16|Update |2
12/3/16|Update |2
13/3/16|Update |2
14/3/16|Update |2
Table: 包裹
Id|Name
1 |package1
2 |package2
Table: 项目
Id|ItemName|PackageId
1 | item1 |1
2 | item2 |1
3 | item3 |1
4 | item4 |2
5 | item5 |2
这些表之间的关系是Audit.PackageID Is foreign key to Package.Id and Item.PackageId is foreign key to Pacakge.id
以上数据,我想生成这样的报告
Package.Name|Item.ItemName|Audit.Date|Audit.Action
package1 | item1 | 1/1/15 | Active
package1 | item2 | 1/2/15 | DeActive
package1 | item3 | NULL | NULL
package2 | item4 | 11/3/16 | update
package2 | item5 | 12/3/16 | update
package2 | NULL | 13/3/16 | update
package2 | NULL | 14/3/16 | update
基本上,如果 item/audit 信息多于包裹数量,物品或审核信息不会重复,包裹信息会重复。希望这是有道理的。
我基本上需要编写一个存储过程来 return 如上所述的数据集。然后将此结果输入报告解析器,该解析器将用 blanks
替换所有 NULL
并生成 Excel 报告。
数据库是 SQL-Server-2000
.
本质上,您要做的是将两份报告合二为一table;您有包裹项目报告和包裹审计报告。通常,您在报告层使用子报告执行此操作。
如果您必须这样做,则必须使用密钥将两个报告生成到 table 中,以便将它们连接在一起。由于您使用的是 SQL 2000,因此您没有 ROW_NUMBER()
函数来生成一些序列号……这很不幸。因此,您可以创建具有递增身份字段的临时 table。
这是您提供的架构:
CREATE TABLE #Audit
(Date varchar(7), Action varchar(8), PackageId int)
;
INSERT INTO #Audit
(Date, Action, PackageId)
VALUES
('1/1/15', 'Active', 1),
('1/2/15', 'DeActive', 1),
('11/3/16', 'Update', 2),
('12/3/16', 'Update', 2),
('13/3/16', 'Update', 2),
('14/3/16', 'Update', 2)
;
CREATE TABLE #Package
(Id int, Name varchar(8))
;
INSERT INTO #Package
(Id, Name)
VALUES
(1, 'package1'),
(2, 'package2')
;
CREATE TABLE #Item
(Id int, ItemName varchar(5), PackageId int)
;
INSERT INTO #Item
(Id, ItemName, PackageId)
VALUES
(1, 'item1', 1),
(2, 'item2', 1),
(3, 'item3', 1),
(4, 'item4', 2),
(5, 'item5', 2)
;
然后再创建两个 table 来保存两个单独的报告并填充它们。报告 tables 需要一个身份字段,以便为报告中的每一行生成一个唯一的编号:
create table #PackageItemsReport
( PackageItemsId int identity(1,1),
PackageId int,
PackageName varchar(8),
ItemName varchar(5)
)
insert into #PackageItemsReport
(PackageId,PackageName,ItemName)
select #Package.Id, #package.Name, #item.ItemName
from #Package
join #Item
on #Package.Id = #item.PackageId
order by #Package.Id, #item.ItemName
create table #PackageAuditReport
( PackageAuditId int identity(1,1),
PackageID int,
PackageName varchar(8),
AuditDate varchar(7),
AuditAction varchar(8)
)
insert into #PackageAuditReport
(PackageID,PackageName,AuditDate,AuditAction)
select #Package.Id, #Package.Name, #Audit.Date, #Audit.Action
from #Package
join #Audit
on #Audit.PackageId = #Package.Id
order by #Package.Id, #Audit.Date, #Audit.Action
然后您需要使用包 ID 和生成的行号将两个报告连接在一起:
select ISNULL(PackageItemsReport.PackageName, PackageAuditReport.PackageName) Name,
ItemName,
AuditDate,
AuditAction
from
(
select #PackageItemsReport.*, PackageItemsId - MinPackageItemsId RowNum
from #PackageItemsReport
join
(
select PackageID, MIN(PackageItemsId) MinPackageItemsId
From #PackageItemsReport
group by PackageID
) MinPackageItemsIds
on #PackageItemsReport.PackageID = MinPackageItemsIds.PackageID
) PackageItemsReport
full join
(
select #PackageAuditReport.*, PackageAuditId - MinPackageAuditId RowNum
from #PackageAuditReport
join
(
select PackageID, MIN(PackageAuditId) MinPackageAuditId
From #PackageAuditReport
group by PackageID
) MinPackageAuditIds
on #PackageAuditReport.PackageID = MinPackageAuditIds.PackageID
) PackageAuditReport
on PackageItemsReport.PackageID = PackageAuditReport.PackageID
and PackageItemsReport.RowNum = PackageAuditReport.RowNum
order by ISNULL(PackageItemsReport.PackageID, PackageAuditReport.PackageID),
ISNULL(PackageItemsReport.RowNum, PackageAuditReport.RowNum)
很乱...谢天谢地 ROW_NUMBER() 函数是在 SQL Server 2000 之后添加的。现在容易多了。
正在努力将此查询概念化。任何帮助将不胜感激。
数据集
Table:审计
Date |Action |PackageId
1/1/15 |Active |1
1/2/15 |DeActive|1
11/3/16|Update |2
12/3/16|Update |2
13/3/16|Update |2
14/3/16|Update |2
Table: 包裹
Id|Name
1 |package1
2 |package2
Table: 项目
Id|ItemName|PackageId
1 | item1 |1
2 | item2 |1
3 | item3 |1
4 | item4 |2
5 | item5 |2
这些表之间的关系是Audit.PackageID Is foreign key to Package.Id and Item.PackageId is foreign key to Pacakge.id
以上数据,我想生成这样的报告
Package.Name|Item.ItemName|Audit.Date|Audit.Action
package1 | item1 | 1/1/15 | Active
package1 | item2 | 1/2/15 | DeActive
package1 | item3 | NULL | NULL
package2 | item4 | 11/3/16 | update
package2 | item5 | 12/3/16 | update
package2 | NULL | 13/3/16 | update
package2 | NULL | 14/3/16 | update
基本上,如果 item/audit 信息多于包裹数量,物品或审核信息不会重复,包裹信息会重复。希望这是有道理的。
我基本上需要编写一个存储过程来 return 如上所述的数据集。然后将此结果输入报告解析器,该解析器将用 blanks
替换所有 NULL
并生成 Excel 报告。
数据库是 SQL-Server-2000
.
本质上,您要做的是将两份报告合二为一table;您有包裹项目报告和包裹审计报告。通常,您在报告层使用子报告执行此操作。
如果您必须这样做,则必须使用密钥将两个报告生成到 table 中,以便将它们连接在一起。由于您使用的是 SQL 2000,因此您没有 ROW_NUMBER()
函数来生成一些序列号……这很不幸。因此,您可以创建具有递增身份字段的临时 table。
这是您提供的架构:
CREATE TABLE #Audit
(Date varchar(7), Action varchar(8), PackageId int)
;
INSERT INTO #Audit
(Date, Action, PackageId)
VALUES
('1/1/15', 'Active', 1),
('1/2/15', 'DeActive', 1),
('11/3/16', 'Update', 2),
('12/3/16', 'Update', 2),
('13/3/16', 'Update', 2),
('14/3/16', 'Update', 2)
;
CREATE TABLE #Package
(Id int, Name varchar(8))
;
INSERT INTO #Package
(Id, Name)
VALUES
(1, 'package1'),
(2, 'package2')
;
CREATE TABLE #Item
(Id int, ItemName varchar(5), PackageId int)
;
INSERT INTO #Item
(Id, ItemName, PackageId)
VALUES
(1, 'item1', 1),
(2, 'item2', 1),
(3, 'item3', 1),
(4, 'item4', 2),
(5, 'item5', 2)
;
然后再创建两个 table 来保存两个单独的报告并填充它们。报告 tables 需要一个身份字段,以便为报告中的每一行生成一个唯一的编号:
create table #PackageItemsReport
( PackageItemsId int identity(1,1),
PackageId int,
PackageName varchar(8),
ItemName varchar(5)
)
insert into #PackageItemsReport
(PackageId,PackageName,ItemName)
select #Package.Id, #package.Name, #item.ItemName
from #Package
join #Item
on #Package.Id = #item.PackageId
order by #Package.Id, #item.ItemName
create table #PackageAuditReport
( PackageAuditId int identity(1,1),
PackageID int,
PackageName varchar(8),
AuditDate varchar(7),
AuditAction varchar(8)
)
insert into #PackageAuditReport
(PackageID,PackageName,AuditDate,AuditAction)
select #Package.Id, #Package.Name, #Audit.Date, #Audit.Action
from #Package
join #Audit
on #Audit.PackageId = #Package.Id
order by #Package.Id, #Audit.Date, #Audit.Action
然后您需要使用包 ID 和生成的行号将两个报告连接在一起:
select ISNULL(PackageItemsReport.PackageName, PackageAuditReport.PackageName) Name,
ItemName,
AuditDate,
AuditAction
from
(
select #PackageItemsReport.*, PackageItemsId - MinPackageItemsId RowNum
from #PackageItemsReport
join
(
select PackageID, MIN(PackageItemsId) MinPackageItemsId
From #PackageItemsReport
group by PackageID
) MinPackageItemsIds
on #PackageItemsReport.PackageID = MinPackageItemsIds.PackageID
) PackageItemsReport
full join
(
select #PackageAuditReport.*, PackageAuditId - MinPackageAuditId RowNum
from #PackageAuditReport
join
(
select PackageID, MIN(PackageAuditId) MinPackageAuditId
From #PackageAuditReport
group by PackageID
) MinPackageAuditIds
on #PackageAuditReport.PackageID = MinPackageAuditIds.PackageID
) PackageAuditReport
on PackageItemsReport.PackageID = PackageAuditReport.PackageID
and PackageItemsReport.RowNum = PackageAuditReport.RowNum
order by ISNULL(PackageItemsReport.PackageID, PackageAuditReport.PackageID),
ISNULL(PackageItemsReport.RowNum, PackageAuditReport.RowNum)
很乱...谢天谢地 ROW_NUMBER() 函数是在 SQL Server 2000 之后添加的。现在容易多了。