【问题标题】:view one particular column data in to several columns by filtering通过过滤查看一个特定列的数据到几列
【发布时间】:2014-03-07 11:34:49
【问题描述】:

我有一个表格,其中有一列包含Leave 类型(AnnualCasualMedical 等)。

现在我需要根据休假类型Annual LeaveCasual LeaveMedical Leave 等将其拆分为多个列。

LeaveAccount

LeaveAccountID, 
LeaveTypeID, 
EmployeeID, 
AccountingYearID, 
TotalLeaves, 
LeavesTaken

LeaveType

LeaveTypeID,
LeaveTypeName

我的查询 [给出一个无限循环] 是:

[FullName, EmplyeeID, AnnualLeave, ShortLeave, Medical Leave]

SELECT
    e.FullName
  , e.EmployeeId
  , a.TotalLeaves as AnnualLeave
  , b.TotalLeaves as shortleave
  , c.TotalLeaves as MedicalLeave
FROM
    LeaveAccount a
  , Employee e
  , LeaveAccount b
  , LeaveAccount c
WHERE
      (a.EmployeeId = b.EmployeeId) 
  and (
            (a.LeaveTypeId = 0) 
        and (b.LeaveTypeId = 20)
        and (c.LeaveTypeId = 1)
      )

我需要使用动态 SQL 吗?我怎么可以这样分裂?

【问题讨论】:

    标签: sql sql-server ssis group-by


    【解决方案1】:

    为什么需要拆分表?

    当您可以创建表的视图时,每个视图将包含一列:

    CREATE VIEW 
       Annual_Leave
    AS 
    SELECT 
       Annual
    FROM 
       Leave types;
    

    您对其余列执行相同操作。

    【讨论】:

      【解决方案2】:

      尝试使用子选择:

      SELECT
          e.FullName
        , e.EmployeeId
        , (SELECT SUM(a.TotalLeaves) FROM LeaveAccount a WHERE a.EmployeeId = e.EmployeeId AND a.LeaveTypeId = 0) AS "AnnualLeave"
        , (SELECT SUM(b.TotalLeaves) FROM LeaveAccount b WHERE b.EmployeeId = e.EmployeeId AND b.LeaveTypeId = 20) AS "ShortLeave"
        , (SELECT SUM(c.TotalLeaves) FROM LeaveAccount c WHERE c.EmployeeId = e.EmployeeId AND c.LeaveTypeId = 1) AS "MedicalLeave"
      FROM
        Employee e
      

      另一种解决方案是分组:

      SELECT
          e.FullName
        , e.EmployeeId
        , SUM(a.TotalLeaves) AS "AnnualLeave"
        , SUM(b.TotalLeaves) AS "ShortLeave"
        , SUM(c.TotalLeaves) AS "MedicalLeave"
      FROM
        Employee e
      INNER JOIN
        LeaveAccount a
      ON
            a.EmployeeId  = e.EmployeeId
        AND a.LeaveTypeId = 0
      INNER JOIN
        LeaveAccount b
      ON
            b.EmployeeId  = e.EmployeeId
        AND b.LeaveTypeId = 20
      INNER JOIN
        LeaveAccount c
      ON
            c.EmployeeId  = e.EmployeeId
        AND c.LeaveTypeId = 1
      GROUP BY
          e.FullName
        , e.EmployeeId
      

      编辑:您可能必须在此处使用LEFT OUTER JOIN 而不是INNER JOIN,具体取决于您的数据。

      【讨论】:

        猜你喜欢
        • 2016-04-03
        • 1970-01-01
        • 2018-02-16
        • 1970-01-01
        • 2019-02-04
        • 2018-09-05
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多