从现有表创建新的SQL Server表

问题描述 投票:1回答:1

我的工作是通过删除月份列并在列字段上重新创建表分组并将小时列相加来更新数据库表。

以下是我的说明:“创建一个没有Month列的新PS_StaffHours表。通过分组(PSScnID / PSEmpID / Prd / WBSID / RatePrd)并将小时相加,将现有的PS_StaffHours数据迁移到新表。”

现在这里是我编写的表格,必须在没有Month列的情况下重新创建并汇总小时列:

CREATE TABLE [dbo].[PS_StaffHours]
(
    [PSScnID] [int] NOT NULL,
    [PSEmpID] [int] NOT NULL,
    [Prd] [int] NOT NULL,
    [WBSID] [int] NOT NULL,
    [RatePrd] [int] NOT NULL,
    [Month] [date] NOT NULL,
    [Hours] [decimal](16, 8) NOT NULL,

   CONSTRAINT [PK_PS_StaffHours] 
       PRIMARY KEY CLUSTERED ([PSScnID] ASC, [PSEmpID] ASC, [Prd] ASC,
                              [WBSID] ASC, [RatePrd] ASC, [Month] 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

ALTER TABLE [dbo].[PS_StaffHours] WITH CHECK 
    ADD CONSTRAINT [FK_PS_StaffHours_PS_Scenarios] 
        FOREIGN KEY([PSScnID]) REFERENCES [dbo].[PS_Scenarios] ([PSScnID])
GO

ALTER TABLE [dbo].[PS_StaffHours] CHECK CONSTRAINT [FK_PS_StaffHours_PS_Scenarios]
GO

ALTER TABLE [dbo].[PS_StaffHours] WITH CHECK 
    ADD CONSTRAINT [FK_PS_StaffHours_PS_Staff] 
        FOREIGN KEY([PSScnID], [PSEmpID]) REFERENCES [dbo].[PS_Staff] ([PSScnID], [PSEmpID])
GO

ALTER TABLE [dbo].[PS_StaffHours] CHECK CONSTRAINT [FK_PS_StaffHours_PS_Staff]
GO

ALTER TABLE [dbo].[PS_StaffHours] WITH CHECK 
    ADD CONSTRAINT [FK_PS_StaffHours_PS_WBS] 
        FOREIGN KEY([PSScnID], [WBSID]) REFERENCES [dbo].[PS_WBS] ([PSScnID], [WBSID])
GO

ALTER TABLE [dbo].[PS_StaffHours] CHECK CONSTRAINT [FK_PS_StaffHours_PS_WBS]
GO

ALTER TABLE [dbo].[PS_StaffHours] WITH CHECK 
    ADD CONSTRAINT [CK_PS_StaffHours] CHECK ((DATEPART(day, [Month]) = (1)))
GO

ALTER TABLE [dbo].[PS_StaffHours] CHECK CONSTRAINT [CK_PS_StaffHours]
GO

EXEC sys.sp_addextendedproperty 
         @name = N'MS_Description', 
         @value = N'Restricts Month field to the 1st of every month.' , 
         @level0type = N'SCHEMA', @level0name = N'dbo',  
         @level1type = N'TABLE', @level1name = N'PS_StaffHours',  
         @level2type = N'CONSTRAINT', @level2name = N'CK_PS_StaffHours'
GO

首先,要创建新表,我认为我所要做的就是在脚本的CREATE部分重命名表名,只删除CREATE语句中Month列的所有引用。我在思考CREATE脚本时是否正确?

现在,这是我将用于填充没有Month字段的表的脚本,但是我不确定我是否正确分组,因为我收到错误,因为我不是在“时间”列上的grouping休息。另外,我不确定如何在查询中查看summing的小时数。

我的代码:

SELECT c.PSScnID, c.PSEmpID, c.Prd, c.WBSID, c.RatePrd, c.Hours  
INTO dbo.NewPS_StaffHours 
FROM PS_StaffHours AS c  
GROUP BY c.PSScnID, c.PSEmpID, c.Prd, c.WBSID, c.RatePrd  
GO
sql sql-server group-by migrate
1个回答
1
投票

你的第一个假设是正确的。要按列分组并总结小时数 - 请尝试以下操作:

SELECT c.PSScnID, c.PSEmpID, c.Prd, c.WBSID, c.RatePrd, SUM(c.Hours) AS Hours
INTO dbo.NewPS_StaffHours 
FROM PS_StaffHours AS c  
GROUP BY c.PSScnID, c.PSEmpID, c.Prd, c.WBSID, c.RatePrd  
GO

听起来你在运行你的选择之前会创建你的表。所以摆脱INTO dbo.NewPS_StaffHours。运行create table语句,然后运行INSERT INTO newTable VALUES... SELECT

© www.soinside.com 2019 - 2024. All rights reserved.