【问题标题】:SQL Server Join Table StatementSQL Server 连接表语句
【发布时间】:2011-06-15 10:47:51
【问题描述】:

我可以加入以下3个语句以在一行中显示sick_total_day、other_total_day、other_total_day(同where子句)?

SELECT staff_key, 
       sum(days_applied) as sick_total_day 

from Tleave_sick_leave 

where staff_key = 131 
and from_date>='2011/4/1 00:00:00' 
and to_date<='2011/4/30 00:00:00';


SELECT staff_key, 
       sum(days_applied) as other_total_day 
from Tleave_other_leave 
where staff_key = 131 
and from_date>='2011/4/1 00:00:00' 
and to_date<='2011/4/30 00:00:00';


SELECT staff_key, 
       sum(days_applied) as other_total_day 

from Tleave_vleave 
where staff_key = 131 
and from_date>='2011/4/1 00:00:00' 
and to_date<='2011/4/30 00:00:00';

【问题讨论】:

  • 您想要这些记录的联合,还是想要这些表中所有记录的记录中的 days_applied 的总和?

标签: sql sql-server join


【解决方案1】:

这将处理重复的 where 子句,但会带来性能损失。

更好的解决方案可能是 EMP 所建议的。规范化您的表以删除重复数据。

SELECT  staff_key
        , SUM(CASE WHEN type = 'Sick' THEN days_applied ELSE 0 END) as sick_total_day       
        , SUM(CASE WHEN type = 'Othert' THEN days_applied ELSE 0 END) as othert_total_day       
        , SUM(CASE WHEN type = 'Otherv' THEN days_applied ELSE 0 END) as otherv_total_day       
FROM    (
            SELECT  staff_key
                    , days_applied
                    , from_date
                    , to_date
                    , [Type] = 'Sick'
            FROM    Tleave_sick_leave
            UNION ALL
            SELECT  staff_key
                    , days_applied
                    , from_date
                    , to_date
                    , 'Othert'
            FROM    Tleave_other_leave
            UNION ALL
            SELECT  staff_key
                    , days_applied
                    , from_date
                    , to_date
                    , 'Otherv'
            FROM    Tleave_vleave
        )
WHERE   staff_key = 131 
        AND from_date>='2011/4/1 00:00:00' 
        AND to_date<='2011/4/30 00:00:00';
GROUP BY
        staff_key

【讨论】:

    【解决方案2】:

    您可能可以在一个语句中执行此操作,但您仍需要 3 个单独的 WHERE 子句,因为每个表中的 from_date 和 to_date 列是完全独立的,尽管名称相同。

    听起来您在表格设计中发现了问题。您有 3 个信息非常相似的表格。如果您可以将它们组合到一张表中,那么您可能也可以使用一个查询。

    【讨论】:

      【解决方案3】:

      您可以将三个表联合在一起以创建一组数据。然后您可以使用 PIVOT 将 SUM 转置为列。

      这应该可行。虽然我没有用任何数据测试过。

      SELECT
          [Tleave_sick_leave],
          [Tleave_other_leave],
          [Tleave_vleave]
      FROM
      (
          SELECT
              'Tleave_sick_leave' [Table],
              [staff_key],
              [days_applied],
              [from_date],
              [to_date]
          FROM
              [Tleave_sick_leave]
          UNION ALL
          SELECT
              'Tleave_other_leave' [Table],
              [staff_key],
              [days_applied],
              [from_date],
              [to_date]
          FROM
              [Tleave_other_leave]
          UNION ALL
          SELECT
              'Tleave_vleave' [Table],
              [staff_key],
              [days_applied],
              [from_date],
              [to_date]
          FROM
              [Tleave_vleave]
      ) [PivotData]
      PIVOT
      (
          SUM([days_applied])
      FOR
          [Table]
      IN
          (
              [Tleave_sick_leave],
              [Tleave_other_leave],
              [Tleave_vleave]
          )
      ) [Data]
      WHERE
          [staff_key] = 131
      AND
          [from_date] >= '2011/4/1 00:00:00' 
      AND
          [to_date] <= '2011/4/30 00:00:00'
      

      注意:这是一种 SQL Server 2005 升级方法。如果您有 2000 或更低,那么您将需要使用 Lieven 的答案,它有效地做同样的事情。

      【讨论】:

        【解决方案4】:

        对 Lieven 提供的代码稍作修改,现在可以使用了……

        SELECT  a.staff_key
                , SUM(CASE WHEN a.type = 'Sick' THEN 
                                a.days_applied ELSE 0 END) as sick_total_day       
                , SUM(CASE WHEN a.type = 'Othert' THEN
                                a.days_applied ELSE 0 END) as othert_total_day       
                , SUM(CASE WHEN a.type = 'Otherv' THEN 
                                a.days_applied ELSE 0 END) as otherv_total_day       
        FROM    
        (
                    SELECT  staff_key
                            , days_applied
                            , from_date
                            , to_date
                            , type = 'Sick'
                    FROM    Tleave_sick_leave
                    UNION ALL
                    SELECT  staff_key
                            , days_applied
                            , from_date
                            , to_date
                            ,type = 'Othert'
                    FROM    Tleave_other_leave
                    UNION ALL
                    SELECT  staff_key
                            , days_applied
                            , from_date
                            , to_date
                            ,type = 'Otherv'
                    FROM    Tleave_vleave
        ) a
        WHERE staff_key = '131' AND 
              from_date>='2011/4/1 00:00:00' AND 
              to_date<='2011/4/30 00:00:00'
        GROUP BY staff_key
        

        【讨论】:

          猜你喜欢
          • 2019-04-21
          • 1970-01-01
          • 1970-01-01
          • 2016-07-31
          • 1970-01-01
          • 2016-03-15
          • 1970-01-01
          • 2021-02-19
          • 2012-07-10
          相关资源
          最近更新 更多