2011-06-01 72 views
0

我有一張表格,其中包含一些需要在屏幕上以特定格式顯示的數據。這在SQL中可能嗎?

表結構如下:

CREATE TABLE [dbo].[JobSheet](
    [JobSheetID] [bigint] IDENTITY(1,1) NOT NULL, 
    [SheetNumber] [bigint] NULL, 
    [JobSheetDate] [datetime] NULL, 
    [ContractID] [bigint] NULL, 
    [ContractCode] [varchar](50) NULL, 
    [ContractTitle] [varchar](100) NULL, 
    [ProjectID] [bigint] NULL, 
    [ProjectCode] [varchar](50) NULL, 
    [ProjectTitle] [varchar](100) NULL, 
    [JobID] [bigint] NULL, 
    [JobCode] [varchar](50) NULL, 
    [JobTitle] [varchar](100) NULL, 
    [SageDatabaseID] [bigint] NULL, 
    [SageDatabaseName] [varchar](50) NULL, 
    [EnteredByID] [bigint] NULL, 
    [EnteredByUsername] [varchar](50) NULL, 
    [DocumentStatus] [varchar](50) NULL, 
    [Deleted] [bit] NULL, 
    [Reference] [varchar](50) NULL, 
    [UpdatedDate] [datetime] NULL, 
    [UpdatedUser] [varchar](50) NULL, 
    [SentToSage] [bit] NULL, 
    [UpdateStatus] [varchar](50) NULL, 
CONSTRAINT [PK_JobSheet] PRIMARY KEY CLUSTERED 
(
    [JobSheetID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[JobSheetLine](
    [JobSheetLineID] [bigint] IDENTITY(1,1) NOT NULL, 
    [JobSheetID] [bigint] NULL, 
    [LineType] [varchar](50) NULL, 
    [TSHumanResourceID] [bigint] NULL, 
    [SageDatabaseID] [bigint] NULL, 
    [Surname] [varchar](50) NULL, 
    [Initial] [varchar](1) NULL, 
    [TimeOn] [datetime] NULL, 
    [TimeOff] [datetime] NULL, 
    [Deleted] [bit] NULL, 
    [B1] [decimal](18, 5) NULL, 
    [B15] [decimal](18, 5) NULL, 
    [B2] [decimal](18, 5) NULL, 
    [HB] [decimal](18, 5) NULL, 
    [S1] [decimal](18, 5) NULL, 
    [S15] [decimal](18, 5) NULL, 
    [S2] [decimal](18, 5) NULL, 
    [HS] [decimal](18, 5) NULL, 
    [O1] [decimal](18, 5) NULL, 
    [T] [decimal](18, 5) NULL, 
    [TS] [decimal](18, 5) NULL, 
    [TT] [decimal](18, 5) NULL, 
    [TP] [decimal](18, 5) NULL, 
    [OT] [decimal](18, 5) NULL, 
    [OS] [decimal](18, 5) NULL, 
    [D] [decimal](18, 5) NULL, 
    [POA] [decimal](18, 5) NULL, 
    [PT1] [decimal](18, 5) NULL, 
    [PT2] [decimal](18, 5) NULL, 
    [CustomCostRate1] [decimal](18, 5) NULL, 
    [CustomCostRate1ID] [bigint] NULL, 
    [CustomCostRate2] [decimal](18, 5) NULL, 
    [CustomCostRate2ID] [bigint] NULL, 
    [CustomCostRate3] [decimal](18, 5) NULL, 
    [CustomCostRate3ID] [bigint] NULL, 
    [CustomCostRate4] [decimal](18, 5) NULL, 
    [CustomCostRate4ID] [bigint] NULL, 
    [CustomCostRate5] [decimal](18, 5) NULL, 
    [CustomCostRate5ID] [bigint] NULL, 
    [CustomCostRate6] [decimal](18, 5) NULL, 
    [CustomCostRate6ID] [bigint] NULL, 
    [UpdatedDate] [datetime] NULL, 
    [UpdatedUser] [varchar](50) NULL, 
    [RejectReason] [varchar](255) NULL, 
    [CurrentStepApprovalCount] [bigint] NULL, 
    [CustomRouteID] [bigint] NULL, 
    [CustomRoute] [bit] NULL, 
    [CurrentStep] [bigint] NULL, 
    [WaitingForType] [varchar](50) NULL, 
    [WaitingForID] [bigint] NULL, 
    [RequestedByID] [bigint] NULL, 
    [LineStatus] [varchar](50) NULL, 
CONSTRAINT [PK_JobSheetLine] PRIMARY KEY CLUSTERED 
(
    [JobSheetLineID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

的數據輸入這樣的屏幕可以顯示JobSheetLineTable更好的格式上: enter image description here

所需的格式,我需要得到數據輸出如下所示: enter image description here

數據需要由員工過濾(RequestedByID在JobSheetLine ta )和每個唯一的合同和項目以及成本費率(成本費率從B1,B15,B2等一直運行到CustomCostRate6)。

每個成本費率的總小時數需要每天計算。

我已經得到儘可能下面的查詢,直到我relized這是行不通的。我認爲問題是由於成本比率是JobSheetLine表中的Columns導致的,但所需的輸出將成本率作爲單個列,速率和值顯示在行中。

我在SQL中使用PIVOT關鍵字進行了研究,但我無法弄清楚我在做什麼。

這裏是我的查詢想出到目前爲止(這不會工作)

DECLARE @Deleted AS BIT 
DECLARE @RequestedByID AS BIGINT 
DECLARE @WeekStartDate AS DATETIME 
DECLARE @WeekEndDate AS DATETIME 
DECLARE @WaitingForUserID AS BIGINT 
DECLARE @WaitingForUserTypeID AS BIGINT 
DECLARE @WaitingForTypeUser AS VARCHAR(50) 
DECLARE @WaitingForTypeUserType AS VARCHAR(50) 

SET @Deleted = 0 
SET @RequestedByID = 2 
SET @WeekStartDate = '2011/05/23 00:00' 
SET @WeekEndDate = '2011/05/29 00:00' 


SELECT 
[JobSheet].[JobSheetDate], 
[JobSheet].[ContractID], 
[JobSheet].[ContractCode], 
[JobSheet].[ContractTitle], 
[JobSheet].[ProjectID], 
[JobSheet].[ProjectCode], 
[JobSheet].[ProjectTitle], 
[JobSheet].[JobID], 
[JobSheet].[JobCode], 
[JobSheet].[JobTitle], 
[JobSheet].[SageDatabaseID], 
ISNULL(SUM([JobSheetLine].[B1]),0) AS B1, 
ISNULL(SUM([JobSheetLine].[B15]),0) AS B15, 
ISNULL(SUM([JobSheetLine].[B2]),0) AS B2, 
ISNULL(SUM([JobSheetLine].[HB]),0) AS HB, 
ISNULL(SUM([JobSheetLine].[S1]),0) AS S1, 
ISNULL(SUM([JobSheetLine].[S15]),0) AS S15, 
ISNULL(SUM([JobSheetLine].[S2]),0) AS S2, 
ISNULL(SUM([JobSheetLine].[HS]),0) AS HS, 
ISNULL(SUM([JobSheetLine].[O1]),0) AS O1, 
ISNULL(SUM([JobSheetLine].[T]),0) AS T, 
ISNULL(SUM([JobSheetLine].[TS]),0) AS TS, 
ISNULL(SUM([JobSheetLine].[TT]),0) AS TT, 
ISNULL(SUM([JobSheetLine].[TP]),0) AS TP, 
ISNULL(SUM([JobSheetLine].[OT]),0) AS OT, 
ISNULL(SUM([JobSheetLine].[OS]),0) AS OS, 
ISNULL(SUM([JobSheetLine].[D]),0) AS D, 
ISNULL(SUM([JobSheetLine].[POA]),0) AS POA, 
ISNULL(SUM([JobSheetLine].[PT1]),0) AS PT1, 
ISNULL(SUM([JobSheetLine].[PT2]),0) AS PT2, 
ISNULL(SUM([JobSheetLine].[CustomCostRate1]),0) AS CustomCostRate1, 
ISNULL(SUM([JobSheetLine].[CustomCostRate2]),0) AS CustomCostRate2, 
ISNULL(SUM([JobSheetLine].[CustomCostRate3]),0) AS CustomCostRate3, 
ISNULL(SUM([JobSheetLine].[CustomCostRate4]),0) AS CustomCostRate4, 
ISNULL(SUM([JobSheetLine].[CustomCostRate5]),0) AS CustomCostRate5, 
ISNULL(SUM([JobSheetLine].[CustomCostRate6]),0) AS CustomCostRate6, 
ISNULL(SUM([JobSheetLine].[B1] + 
      [JobSheetLine].[B15] + 
      [JobSheetLine].[B2] + 
      [JobSheetLine].[HB] + 
      [JobSheetLine].[S1] + 
      [JobSheetLine].[S15] + 
      [JobSheetLine].[S2] + 
      [JobSheetLine].[HS] + 
      [JobSheetLine].[O1] + 
      [JobSheetLine].[T] + 
      [JobSheetLine].[TS] + 
      [JobSheetLine].[TT] + 
      [JobSheetLine].[TP] + 
      [JobSheetLine].[OT] + 
      [JobSheetLine].[OS] + 
      [JobSheetLine].[D] + 
      [JobSheetLine].[POA] + 
      [JobSheetLine].[PT1] + 
      [JobSheetLine].[PT2] + 
      [JobSheetLine].[CustomCostRate1] + 
      [JobSheetLine].[CustomCostRate2] + 
      [JobSheetLine].[CustomCostRate3] + 
      [JobSheetLine].[CustomCostRate4] + 
      [JobSheetLine].[CustomCostRate5] + 
      [JobSheetLine].[CustomCostRate6]),0) AS TotalHours 



FROM [JobSheet] 

INNER JOIN [JobSheetLine] 
ON [JobSheetLine].[JobSheetID]=[JobSheet].[JobSheetID] 

WHERE 
    [JobSheet].[Deleted][email protected] 
AND [JobSheet].[JobSheetDate] >= @WeekStartDate 
AND [JobSheet].[JobSheetDate] <= @WeekEndDate 
AND [JobSheetLine].[Deleted][email protected] 
AND [JobSheetLine].[RequestedByID][email protected] 

GROUP BY 
    [JobSheet].[JobSheetDate], 
    [JobSheet].[ContractID], 
    [JobSheet].[ContractCode], 
    [JobSheet].[ContractTitle], 
    [JobSheet].[ProjectID], 
    [JobSheet].[ProjectCode], 
    [JobSheet].[ProjectTitle], 
    [JobSheet].[JobID], 
    [JobSheet].[JobCode], 
    [JobSheet].[JobTitle], 
    [JobSheet].[SageDatabaseID] 

是否可以達到我想要的數據結構的輸出,因爲它是在時刻?我寧願在SQL中做所有的計算,因爲它的速度更快,但我可以在C#中進行一些計算,因爲這是一個asp.net項目。

+0

發佈架構中不存在「所需輸出」的列(除了我猜測ProjectId = Project)? – JNK 2011-06-01 12:18:41

+1

我對你的報告中列出的任何人感到抱歉。誰能以7.51英鎊/小時的速度生存下去? :-) – 2011-06-01 12:21:22

+0

@JNK - 我所提到的costt匯率(B1,b15,b2等)應作爲行顯示在所需輸出的Pay Code列中(如果您查看屏幕截圖,您實際上可以看到成本率)是我所有的工作以及 – WraithNath 2011-06-01 12:23:10

回答

1

正如我在原來的問題意見建議,我相信正常化一個很好的長期解決方案。

2

回答這個問題是由寺門S.建議在下面的格式需要進行標準化的表:

enter image description here