SQL 组织报告 columns/rows

SQL report organizing columns/rows

早上好,关于使用 SQL 创建报告的问题。花了一些时间试图弄清楚如何做到这一点。所以这是代码...

select 
c.searchname as 'Client Name',
w.Date as 'Date',
j.Name as 'Engagement Name',
j.JobID as 'Eng #',
sum(units) as 'Hours',
ca.Description as 'Description'
from tblWip w
join tblJob j on w.jobid=j.jobid
join tblclient c on j.clientid=c.clientid
join tblChargeAccs ca on w.chargeacid=ca.ChargeAcID
where j.PartnerID='19'
group by c.searchname, j.name, w.date, j.jobid, w.units, w.amount, ca.description
order by c.searchname, w.date asc

输出这个...

我想将输出格式化为更像这样...

关于如何重新排列这些列和行有什么建议吗?任何帮助表示赞赏。感谢阅读!

列的顺序完全按照您在 SQL 的 Select 子句中指定的顺序排列。 这些行按照您在 Order By 子句中指定的顺序排序。

所以要改变这些,只需改变你写这两个子句的方式:

select c.searchname 'Client Name',
   j.Name 'Engagement Name',
   j.JobID 'Eng #',
   sum(units) hours,
from tblWip w
   join tblJob j on w.jobid=j.jobid
   join tblclient c on j.clientid=c.clientid
   join tblChargeAccs ca on w.chargeacid=ca.ChargeAcID
where j.PartnerID='19'
group by c.searchname, j.name, w.date, 
  j.jobid, w.units, w.amount, ca.description
order by c.searchname, w.date asc

让列反映日期并为数据中的每个日期设置一个单独的列更难。这称为 Pivoting the data. Google this as it is a topic of its own. Most database products have a built in function (in SQL Server it is called Pivot) 可以为您执行此操作,但您需要阅读文档(提供了一个 link)以了解如何正确使用它。

如果您提前知道哪些日期需要列,则可以在不使用动态透视的情况下编写它。使用您的示例数据:

select c.searchname 'Client Name',
   j.Name 'Engagement Name',
   j.JobID 'Eng #',
   sum(case when w.Date = '25Jun2017' then units end) '25Jun2017hours',
   sum(case when w.Date = '26Jun2017' then units end) '26Jun2017hours',
   sum(case when w.Date = '27Jun2017' then units end) '27Jun2017hours'
from tblWip w
   join tblJob j on w.jobid=j.jobid
   join tblclient c on j.clientid=c.clientid
   join tblChargeAccs ca on w.chargeacid=ca.ChargeAcID
where j.PartnerID='19'
group by c.searchname, j.name, w.date, 
  j.jobid, w.units, w.amount, ca.description
order by c.searchname, w.date asc