【问题标题】:Is this possible in SQL?这在 SQL 中可能吗?
【发布时间】:2011-06-01 12:14:25
【问题描述】:

我有一个表格,其中包含一些需要在屏幕上以某种格式显示的数据。

表结构如下:

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 的格式:

获取数据所需的格式如下图所示:

需要按员工过滤数据(JobSheetLine 表中的 RequestedByID) 以及每个独特的、合同和项目以及成本费率(成本费率从 B1、B15、B2 等一直到 CustomCostRate6)。

每个成本费率的总小时数需要是每天。

在我意识到这行不通之前,我已经完成了下面的查询。我认为问题是由于成本费率是 JobSheetLine 表中的列引起的,但所需的输出将成本费率作为单列,并且费率和值显示在行上。

我研究过在 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]=@Deleted
AND [JobSheet].[JobSheetDate] >= @WeekStartDate
AND [JobSheet].[JobSheetDate] <= @WeekEndDate
AND [JobSheetLine].[Deleted]=@Deleted
AND [JobSheetLine].[RequestedByID]=@RequestedByID

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 项目。

【问题讨论】:

  • 发布的架构中不存在来自“所需输出”的列(除了我猜 ProjectId = Project)?
  • 我为你的报告中列出的任何人感到抱歉。谁能以 7.51 英镑/小时的价格生存? :-)
  • @JNK - 我提到的成本费率(B1、b15、b2 等)应显示为所需输出的“支付代码”列中的行(如果您查看屏幕截图,您实际上可以看到成本率)这也是我必须使用的全部
  • 没有办法把这个问题交给未能规范化“JobSheetLine 表”的数据库设计者吗?该表的糟糕设计是您查询问题的根本原因。在处理源自该表的数据时,通常需要复杂的计算和变通方法
  • @Simen S - 可以标准化表格,你有什么建议?将成本率值抽象到另一个表中,这样每行只有一个成本率代码和值?

标签: asp.net sql sql-server


【解决方案1】:

Simen S 提出了这个问题的答案。需要将表格标准化为以下格式:

【讨论】:

    【解决方案2】:

    正如我对原始问题的评论中所建议的,我相信标准化是一个很好的长期解决方案。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 2011-05-19
      • 2011-04-07
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多