【问题标题】:How to show rows horizontally instead of vertically?如何水平而不是垂直显示行?
【发布时间】:2019-07-14 06:30:56
【问题描述】:

我收到这样的记录:

Rev-- Status-- Remarks-- RemarksDate -- User
0     prepared  done     12/jul/2019    John
0     approved  done     12/jul/2019    Amy
0     Issued    done     13/jul/2019    Tom
1     REOPENED  done     14/jul/2019    John
1     Prepared  done     14/jul/2019    Ritz

但我想这样显示

Rev   PreparedBy APprovedBy IssuedBy REOPENEDBy  Date
0     John       Amy        Tom      John        onlyissuedate
1     John       Ritz       Marine   Riya            //

我试图在不改变表结构的情况下实现这一点,但不能。

查询:

        Select * from table

不需要在第二种格式中包含备注。

准备好了,我使用status# 0approve 1issue 3reopened 5

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012


    【解决方案1】:

    透视查询方法应该在这里工作:

    SELECT
        rh.Rev,
        MAX(CASE WHEN rh.Status = 'prepared' THEN rh.RemarksByName END) AS PreparedBy,
        MAX(CASE WHEN rh.Status = 'approved' THEN rh.RemarksByName END) AS ApprovedBy,
        MAX(CASE WHEN rh.Status = 'Issued'   THEN rh.RemarksByName END) AS IssuedBy,
        MAX(CASE WHEN rh.Status = 'REOPENED' THEN rh.RemarksByName END) AS reopenedBy,
        MAX(CASE WHEN rh.Status = 'Issued'   THEN rh.RemarksDate END)   AS Date
    FROM RemarksHisotry rh
    INNER JOIN inspectionReport ir
        ON ir.InspectionReportID = rh.InspectionReportID
    INNER JOIN Status s
        ON s.StatusID = rh.[Status]
    WHERE
        ir.VelosiReportNo = @InspectionReportNo
    GROUP BY
        rh.Rev
    ORDER BY
        rh.Rev;
    

    【讨论】:

      【解决方案2】:

      这可能会有所帮助。

      DECLARE @TempData TABLE(Rev VARCHAR(10),Status VARCHAR(50),Remarks VARCHAR(50),RemarksDate DATE,UserName VARCHAR(50))
      INSERT INTO  @TempData VALUES
      ('0',     'Prepared',  'done',     '12/jul/2019',    'John'),
      ('0',     'Approved',  'done',     '12/jul/2019',    'Amy '),
      ('0',     'Issued  ',  'done',     '13/jul/2019',    'Tom '),
      ('0',     'Reopened',  'done',     '14/jul/2019',    'John'),
      ('1',     'Reopened',  'done',     '14/jul/2019',    'Marine'),
      ('1',     'Prepared',  'done',     '14/jul/2019',    'John'),
      ('1',     'Approved',  'done',     '12/jul/2019',    'Ritz '),
      ('1',     'Issued',    'done',     '14/jul/2019',    'John')
      
      SELECT pvtValue.Rev
            ,pvtValue.Prepared PreparedBy
            ,pvtValue.Approved ApprovedBy
            ,pvtValue.Issued IssuedBy
            ,pvtValue.Reopened ReopenedBy
            ,t.RemarksDate IssueDate
      FROM( 
           SELECT Rev,Status,UserName
           FROM  @TempData
      
           ) pvt
           PIVOT (MAX(UserName) FOR STATUS IN (Prepared,Approved,Issued, Reopened )
           ) pvtValue 
           LEFT JOIN @TempData t ON pvtValue.Issued = t.UserName AND pvtValue.Rev = t.Rev AND t.Status = 'Issued'
      

      【讨论】:

      • 是的,这只是 PIVOT 的工作。
      【解决方案3】:

      您可以简单地实现这一点,而无需JOIN 同一张表的任何副本。 您所需要的只是一种将每行值转换为列的方法(我们将为此使用CASE WHEN),我们将把它与聚合函数MAX结合起来,它将忽略我们在案例中指定的NULL值以上。

      select 
          rev,
          max(case when status='prepared' then user        else null end) preparedBy,
          max(case when status='approved' then user        else null end) approvedBy,
          max(case when status='Issued'   then user        else null end) IssuedBy  ,
          max(case when status='REOPENED' then user        else null end) reopenedBy,
          max(case when status='Issued'   then remarksdate else null end) date
      from
          table_name
      group by
          rev
      order by
          rev
      

      【讨论】:

      • @Stacky 我编辑了我的帖子,我之前的帖子在我完成之前就被接受了
      猜你喜欢
      • 2021-01-18
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多