获取特定的TUPLE并将其返回sql

时间:2016-01-15 04:44:21

标签: sql-server

我正在尝试从与其没有直接关系的表中为客户开账单,并且任何类型的连接似乎都不想使用Alter表语句。

我有4张桌子:

  • 地点
  • AllEvents
  • DesiredStaffLevel
  • EventBill

AllEvents.EVENTID是所有其他表中的外键。

DesiredStaffLevel有一个计算列,表示我要在TotalManHours

中使用的名为EventBill的工作小时数

Venue有一个名为VenueRate的变量我想在事件账单中使用(场地是AllEvents中的fk

所以我想要的是由TotalRate乘以TotalManHours的总和。

我的问题是,会场信息通过场地ID链接到Allevents表,而偶数键链接到事件帐单和所需的员工级别。

我认为这样的事情可行,但事实并非如此。我认为它是因为它无法找到具体的VENUEID / VenueRate,但我不太确定。

Select Sum(DesiredStaffLevel.TotalManHours)AS TotalHours

     From DesiredStaffLevel

     Join AllEvents ON eventID = EventIDFK

      For EventID !=  null(

      Alter Table EventBill

      ADD EstCharge  ASSum(TotalManHours * VenueRate)    

      Group BY eventIdfk;

      )

1 个答案:

答案 0 :(得分:0)

我正在寻求答案而不是评论,因为我需要格式化以帮助解释。

在SQL中,您不要在 select 查询中组合 alter table 。您更有可能需要更新查询,并且您不需要更改表格

但是,您对现有表格的描述不完整且难以理解。您需要做的是提供表名,然后列出列名,然后分别为每个表的一些示例数据。

例如

AllEvents
EVENTIDFK, VENUEIDFK, EventDate,  EventName
1,         88,        2016-01-17, VIP 60th Birthday

Venue
VENUEID, VenueRate 
88,      12.12

DesiredStaffLevel
EVENTIDFK, TotalManHours
1,         100

EventBill
EVENTIDFK, EstCharge
1,

然后使用查询:

SELECT
      ae.EVENTID
    , v.VENUEID
    , v.VenueRate
    , dse.TotalManHours
    , (dse.TotalManHours * v.VenueRate) AS CalculatedBill
FROM AllEvents AS ae
      INNER JOIN Venue AS v ON ae.VENUEIDFK = v.VENUEID
      INNER JOIN DesiredStaffLevel AS dse ON ae.EVENTID = dse.EVENTIDFK
;

提供此结果:

| EVENTID | VENUEID | VenueRate | TotalManHours | CalculatedBill |
|---------|---------|-----------|---------------|----------------|
|       1 |      88 |     12.12 |           100 |        1212.00 |

如何将计算结果输入Table EventBill?

使用这样的更新:

UPDATE
      EventBill
SET EstCharge = dt.CalculatedBill
FROM EventBill
      INNER JOIN (
            SELECT
                  ae.EVENTID
                , SUM(dse.TotalManHours * v.VenueRate) AS CalculatedBill
            FROM AllEvents AS ae
                  INNER JOIN Venue AS v ON ae.VENUEIDFK = v.VENUEID
                  INNER JOIN DesiredStaffLevel AS dse ON ae.EVENTID = dse.EVENTIDFK
            GROUP BY
                  ae.EVENTID
      ) AS dt ON EventBill.EVENTIDFK = dt.EVENTID
;

然后使用简单的选择

检查结果
SELECT
      *
FROM EventBill
;

结果是:

| EVENTIDFK | EstCharge |
|-----------|-----------|
|         1 |   1212.00 |

这是一个工作演示(在sqlfiddle)http://sqlfiddle.com/#!6/31f09/2