0

我有一个表成本类别:

CREATE TABLE [dbo].[CostCategory](
[ID_CostCategory] [int] NOT NULL,
[Name] [varchar](150) NOT NULL,
[Plan] [money] NOT NULL,
[Realization] [money] NULL,
)
go

我有另一个定义成本的表:

CREATE TABLE [dbo].[Cost](
[ID_Cost] [int] NOT NULL,
[Name] [varchar](50) NULL,
[ID_CostCategory] [int] NULL,
[ID_Department] [int] NULL,
[ID_Project] [int] NULL,
[Value] [money] NULL,
)
go 

我想要做的是汇总成本表中的值(根据 ID_CostCategory)并放入成本类别表的实现列中。因此,每个 ID_CostCategory 都会自动显示成本表中的成本总和(每个 ID_CostCategory)。

如何修改成本类别表的脚本来实现?可能这不是一门火箭科学,但我对 SQL 真的很陌生。


好的。我忘记添加的另一件事......结构看起来在某种程度上:
成本>成本类别>部门>项目

现在我可以轻松地从成本表中获取数据并将其呈现在成本类别表中。但成本表包括以下数据:

ID_Cost Name    ID_CostCategory ID_Department   ID_Project  Value
1   fv 001  1   1   1   100
2   fv 002  2   1   1   500
3   fv 003  2   2   1   300
4   fv 004  3   2   2   150
5   fv 005  3   3   2   30
6   fv 006  4   3   2   15

我还有表部门,其中包括列:ID_Department、名称、计划、

所以现在,我要做的是对 Cost 表中的值(根据 ID_CostCategory 和 ID_Department)求和,并将其作为实现列放入 Department 表中。因此,每个 ID_Department 都会自动显示成本表中的成本总和(每个 ID_CostCategory 和 ID_Department)。

希望它很清楚(稍后将不得不使用 table Project 来完成,但一旦我得到它,它会很容易)

4

2 回答 2

0

您不需要将实现列作为 CostCategory 表的一部分。相反,您将希望使用联接。

Select A.ID_CostCategory, A.Name, SUM(B.Value) As Realization from CostCategory A
JOIN Cost B ON A.ID_CostCategory = B.ID_CostCategory
Group By A.ID_CostCategory, A.Name
于 2013-09-11T19:13:16.787 回答
0

试试这个

--create table without realization column
CREATE TABLE [dbo].[CostCategory](
[ID_CostCategory] [int] NOT NULL,
[Name] [varchar](150) NOT NULL,
[Plan] [money] NOT NULL
) go

CREATE TABLE [dbo].[Cost](
[ID_Cost] [int] NOT NULL,
[Name] [varchar](50) NULL,
[ID_CostCategory] [int] NULL,
[ID_Department] [int] NULL,
[ID_Project] [int] NULL,
[Value] [money] NULL,

) go 

创建一个 UDF 来计算成本列的总和:

CREATE FUNCTION [dbo].[CalculateRealization](@Id INT) 
RETURNS money
AS 
BEGIN
  DECLARE @cost money

  SELECT @cost = SUM(Value)
  FROM [dbo].[Cost]
  WHERE [ID_CostCategory] = @ID

  return @cost
END

现在更改您的 CostCategory 表以添加计算列:

ALTER TABLE [dbo].[CostCategory]
   ADD [Realization] AS dbo.CalculateRealization(ID_CostCategory);

现在您可以从 Costcategory 中选择 Realization

SELECT ID_CostCategory, Realization
FROM [dbo].[CostCategory]

在下面回答您的评论:

创建另一个 UDF

CREATE FUNCTION [dbo].[CheckValue](@Id INT, @value Money) 
RETURNS INT
AS 
BEGIN
  DECLARE @flg INT
  SELECT @flg = CASE WHEN [Plan] >= @value THEN 1 ELSE 0 END
  FROM [dbo].[CostCategory]
  WHERE [ID_CostCategory] = @ID

  return @flg;
END

现在在成本表上添加约束:

ALTER TABLE ALTER TABLE [dbo].[Cost]
  ADD CONSTRAINT CHK_VAL_PLAN_COSTCATG
    CHECK(dbo.CheckValue(ID_CostCategory, Value) = 1)
于 2013-09-11T19:21:23.730 回答