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
早上好,关于使用 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