我被要求创建一个自动创建此电子表格的vb.net WinForms应用程序:
显然,手动创建该电子表格是一项艰巨的任务。
我很乐意编写SQL来提取每个单独的数据字段,但是我必须相信有更好的方法。这样的方法需要144个查询!!
我考虑过为每个字段创建一个带有单独标签的表单,或者使用gridview。最终用户都可以接受,但我真的不确定如何编写查询来生成看起来像最终产品的数据集。
我不是要求任何人为我编写任何代码,我要求帮助的是我应该如何攻击这项任务的概念。
这是我写的一个查询,它在电子表格的第一周返回业务单元#1的字段。我不认为它有多大帮助,但我添加它是为了表明我已经付出了一些努力。
DECLARE @WeekEnding AS DATE
DECLARE @DIV AS INT
SET @WeekEnding = '11/13/2015'
SET @DIV = 20
-- A/R downpayments OPCH
SELECT
SUM(OPCH.DocTotal - OPCH.VatSum - OPCH.TotalExpns) AS 'ARDownPaymentInvoice'
FROM OPCH
LEFT JOIN INV1 ON OPCH.DocEntry = INV1.DocEntry AND INV1.VisOrder = 0
LEFT JOIN OITM ON INV1.ItemCode = OITM.ItemCode
LEFT JOIN OITB ON OITM.ItmsGrpCod = OITB.ItmsGrpCod
LEFT JOIN OACT AS CurrCode (NOLOCK) ON OITB.RevenuesAc = CurrCode.AcctCode
WHERE DATEPART(WEEK, OPCH.DocDate) = DATEPART(WEEK, @WeekEnding) AND YEAR(OPCH.DocDate) = YEAR(@WeekEnding)
AND CurrCode.Segment_4 = @DIV
-- Credits ORIN
SELECT
SUM(ORIN.DocTotal - ORIN.VatSum - ORIN.TotalExpns) * -1 AS 'Credit'
FROM ORIN
LEFT JOIN INV1 ON ORIN.DocEntry = INV1.DocEntry AND INV1.VisOrder = 0
LEFT JOIN OITM ON INV1.ItemCode = OITM.ItemCode
LEFT JOIN OITB ON OITM.ItmsGrpCod = OITB.ItmsGrpCod
LEFT JOIN OACT AS CurrCode (NOLOCK) ON OITB.RevenuesAc = CurrCode.AcctCode
WHERE DATEPART(WEEK, ORIN.DocDate) = DATEPART(WEEK, @WeekEnding) AND YEAR(ORIN.DocDate) = YEAR(@WeekEnding)
AND CurrCode.Segment_4 = @DIV
--Invoices
SELECT
SUM(OINV.DocTotal - OINV.VatSum - OINV.TotalExpns) AS 'Invoice'
FROM OINV
LEFT JOIN INV1 ON OINV.DocEntry = INV1.DocEntry AND INV1.VisOrder = 0
LEFT JOIN OITM ON INV1.ItemCode = OITM.ItemCode
LEFT JOIN OITB ON OITM.ItmsGrpCod = OITB.ItmsGrpCod
LEFT JOIN OACT AS CurrCode (NOLOCK) ON OITB.RevenuesAc = CurrCode.AcctCode
WHERE DATEPART(WEEK, OINV.DocDate) = DATEPART(WEEK, @WeekEnding) AND YEAR(OINV.DocDate) = YEAR(@WeekEnding)
AND CurrCode.Segment_4 = @DIV`
感谢任何想法。
答案 0 :(得分:2)
我会做一个支点,而不是做多个查询。但是我觉得你应该问问自己或最终用户:"你真的希望按日期看到老化的报告作为列吗?"如果是这样,每次报告再次增加时,我都会手动添加一个?这是一个自解压示例FYI。第一组只是显示我的数据,我模拟了用户,他们所属的部门以及他们的最后访问权限。然后我假装我想要一份老化报告,看看总共有多少人访问系统,以及每个虚拟部门。在SQL中执行多个查询是很昂贵的,并且通常可以通过一点点了解枢轴,联合以及使用SQL创造性地保存数据来缓解这些问题。
DECLARE @Example TABLE (PersonId INT IDENTITY, PersonName VARCHAR(128), DepartmentName VARCHAR(128), AccessedOn Date);
INSERT INTO @Example (PersonName, DepartmentName, AccessedOn) VALUES ('Brett', 'Dev', '1-1-2017'), ('John', 'Dev', '1-6-2017'), ('Mark', 'Dev', '1-8-2017'), ('Shawn', 'Ops', '1-15-2017'), ('Ryan', 'Ops', '1-16-2017'), ('Kevin', 'Ops', '1-21-2017');
--Data as is
SELECT *
From @Example
--I would use Date By row as it is far easier to maintain
SELECT
DATEADD(WEEK, DATEDIFF(WEEK, 0, AccessedOn), 0) AS Grouping
, COUNT(PersonId) AS PeopleAccessedAtTime
, SUM(CASE WHEN DepartmentName = 'Dev' THEN 1 ELSE 0 END) AS DevCounts
, SUM(CASE WHEN DepartmentName = 'Ops' THEN 1 ELSE 0 END) AS OpsCounts
FROM @Example
GROUP BY DATEADD(WEEK, DATEDIFF(WEEK, 0, AccessedOn), 0)
--Aging Report you are asking for trouble as you need to manually pivot ELSE go down the road of doing dynamic sql to do a pivot which is No Bueno
; WITH x AS
(
SELECT
DATEADD(WEEK, DATEDIFF(WEEK, 0, AccessedOn), 0) AS Grouping
, COUNT(PersonId) AS PeopleAccessedAtTime
, SUM(CASE WHEN DepartmentName = 'Dev' THEN 1 ELSE 0 END) AS DevCounts
, SUM(CASE WHEN DepartmentName = 'Ops' THEN 1 ELSE 0 END) AS OpsCounts
FROM @Example
GROUP BY DATEADD(WEEK, DATEDIFF(WEEK, 0, AccessedOn), 0)
)
Select
'PeopleAccessed' AS Header
, MAX([2017-01-02]) AS [2017-01-02]
, Max([2017-01-09]) AS [2017-01-09]
, Max([2017-01-16]) AS [2017-01-16]
From x
PIVOT(MAX(PeopleAccessedAtTime) FOR Grouping IN ([2017-01-02], [2017-01-09], [2017-01-16])) AS pvt
UNION
Select
'DevDivisionAccessed'
, MAX([2017-01-02]) AS [2017-01-02]
, Max([2017-01-09]) AS [2017-01-09]
, Max([2017-01-16]) AS [2017-01-16]
From x
PIVOT(MAX(DevCounts) FOR Grouping IN ([2017-01-02], [2017-01-09], [2017-01-16])) AS pvt
UNION
Select
'OpsDivisionAccessed'
, MAX([2017-01-02]) AS [2017-01-02]
, Max([2017-01-09]) AS [2017-01-09]
, Max([2017-01-16]) AS [2017-01-16]
From x
PIVOT(MAX(OpsCounts) FOR Grouping IN ([2017-01-02], [2017-01-09], [2017-01-16])) AS pvt
答案 1 :(得分:1)
实现这一目标的一种方法:
CREATE TABLE #tmpData
(column1 varchar(50),
column2 varchar(50),
column3 varchar(50),
column4 varchar(50),
column5 varchar(50),
column6 varchar(50),
column7 varchar(50),
column8 varchar(50),
column9 varchar(50),
column10 varchar(50),
column11 varchar(50),
column12 varchar(50))
然后您可以插入一行显示每列的日期
INSERT INTO #tmpData
--Write your select query here for filling in all the dates
然后,您将为行中的每个订单项插入数据。
INSERT INTO #tmpdata
SELECT 'Business Unit 1',
-- insert remaining column data here