获取每个日期间隔的管道总长度

| 我有一个包含
pipes
的表,该表安装在某个位置。 安装日期始终为空,删除日期可以为NULL
Type   Installed     Removed     Length
PT2    01/01/2011    NULL        2000
PT2    01/01/2011    NULL        2000
PT1    01/01/2011    NULL        1200
PT1    01/01/2011    NULL        1200
PT1    15/02/2011    25/02/2011  1000
PT1    15/02/2011    25/02/2011  1000
现在,我需要概述给定月份安装的每种类型的总长度,因此结果应为例如从
01/02/2011
28/02/2011
 Type    From         To            Length
 PT2     01/02/2011   28/02/2011    4000
 PT1     01/02/2011   14/02/2011    2400 
 PT1     15/02/2011   24/02/2011    4400 Edit: (starts on 15 not 14)
 PT1     25/02/2011   28/02/2011    2400
编辑:对此预期结果进行澄清。 最后,它将用于查看请求月份内任何给定时刻的管道总长度。因此,如果您看上表,在2月2日安装了
PT2
管道。它们是在一月份安装的,但仍然存在,因此整个月的总长度为4000。 与ѭ6相同:从2月开始,已安装PT1管道,因此为2400。但是,在15日,又安装了2条长度为1000的PT1管道,因此在15日至25日期间,PT1管道的总长度为4400。 这2个管道已在25日移除,因此25月底的月底再次是2400。 我希望这现在更有意义。 我正在努力使用SQL执行此操作,这只是为了一份报告,通常在任何给定的月份中都安装了数百个这样的管道。 它可以在Powerbuilder应用程序中使用,因此,如果您知道任何可能有助于共享的数据窗口技巧,便会发现。     
已邀请:
玩得太开心了!我采取了一些自由措施,例如假设排序顺序,并将查询条件更改为日期范围,而不是声明一个月。 首先,我将数据集从日期范围更改为更改日期和更改数量(安装日期为正值,移除日期为负值)。
SELECT type,
    installed as date_of_change,
    length change_of_length 
FROM pipes 
WHERE (installed BETWEEN :date_start AND
         :date_end) OR
     ((installed < :date_start) AND
         (isnull (removed, :date_end) >= :date_start)) 
UNION  ALL 
SELECT type,
    isnull (removed, dateadd (day, 1, :date_end)),
    (length * -1) 
FROM pipes 
WHERE (installed BETWEEN :date_start AND
         :date_end) OR
     ((installed < :date_start) AND
         (isnull (removed, :date_end) >= :date_start)) 
ORDER BY type,
    date_of_change 
而且,是的,参数前面的冒号(我已将您切换为开始日期和结束日期……对我来说更容易了,现在您可以进行六个月的报告了)意味着我正在利用DataWindow。 (我敢打赌,有人可以通过上述概念更改来创建一种纯SQL方法,但我会按照我所知道的去做。) 将SQL加载到DataWindow中(我使用了自由格式),并可以选择通过类型和date_of_change(皮带和悬挂器)设置客户端排序。数据集包含空的删除日期作为查询范围结束后第二天的更改,因此,请创建一个过滤器以排除这些空值:
 date_of_change <=  date_end 
根据类型创建一个组,然后将type放入组标题中。 在详细信息区域(所有后续控件都将移至其中)中,使用以下表达式创建一个名为date_from的计算:
if (date_of_change < date_start, date_start, date_of_change)
使用以下表达式创建一个名为date_to的计算:
if (type = type[1] and getrow() < rowcount() and date_of_change[1] <= date_end, 
RelativeDate(date_of_change[1], -1),  date_end )
使用以下表达式创建一个名为installed_length的计算:
cumulativesum ( change_of_length FOR GROUP 1)
选择详细信息区域中的所有控件,并为它们提供以下可见表达:
if (date_of_change =  date_of_change [1] and  type = type[1], 0, 1)
如果下一行具有相同的date_of_change和type,它将使它们不可见;您只希望最后一行显示今天所有活动的总和。 将明细区拖动到高度为零,并使明细区自动调整高度。 这将为您提供您所追求的版本。 FWIW,我试图使报表按日期排序(不清楚这是否是您想要的,还是先按类型排序),但是它破坏了CumulativeSum()功能。也许其他人可以解决。 祝好运, 特里 附言如果SO让我投入这么多,这就是我的原型的输出。它可能对您没有用处。
release 11.5;
datawindow(units=0 timer_interval=0 color=1073741824 brushmode=0 transparency=0 gradient.angle=0 gradient.color=8421504 gradient.focus=0 gradient.repetition.count=0 gradient.repetition.length=100 gradient.repetition.mode=0 gradient.scale=100 gradient.spread=100 gradient.transparency=0 picture.blur=0 picture.clip.bottom=0 picture.clip.left=0 picture.clip.right=0 picture.clip.top=0 picture.mode=0 picture.scale.x=100 picture.scale.y=100 picture.transparency=0 processing=0 HTMLDW=no print.printername=\"\" print.documentname=\"\" print.orientation = 0 print.margin.left = 110 print.margin.right = 110 print.margin.top = 96 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.canusedefaultprinter=yes print.prompt=no print.buttons=no print.preview.buttons=no print.cliptext=no print.overrideprintjob=no print.collate=yes print.background=no print.preview.background=no print.preview.outline=yes hidegrayline=no showbackcoloronxp=no picture.file=\"\" )
header(height=72 color=\"536870912\" transparency=\"0\" gradient.color=\"8421504\" gradient.transparency=\"0\" gradient.angle=\"0\" brushmode=\"0\" gradient.repetition.mode=\"0\" gradient.repetition.count=\"0\" gradient.repetition.length=\"100\" gradient.focus=\"0\" gradient.scale=\"100\" gradient.spread=\"100\" )
summary(height=0 color=\"536870912\" transparency=\"0\" gradient.color=\"8421504\" gradient.transparency=\"0\" gradient.angle=\"0\" brushmode=\"0\" gradient.repetition.mode=\"0\" gradient.repetition.count=\"0\" gradient.repetition.length=\"100\" gradient.focus=\"0\" gradient.scale=\"100\" gradient.spread=\"100\" )
footer(height=0 color=\"536870912\" transparency=\"0\" gradient.color=\"8421504\" gradient.transparency=\"0\" gradient.angle=\"0\" brushmode=\"0\" gradient.repetition.mode=\"0\" gradient.repetition.count=\"0\" gradient.repetition.length=\"100\" gradient.focus=\"0\" gradient.scale=\"100\" gradient.spread=\"100\" )
detail(height=0 color=\"536870912\" transparency=\"0\" gradient.color=\"8421504\" gradient.transparency=\"0\" gradient.angle=\"0\" brushmode=\"0\" gradient.repetition.mode=\"0\" gradient.repetition.count=\"0\" gradient.repetition.length=\"100\" gradient.focus=\"0\" gradient.scale=\"100\" gradient.spread=\"100\" height.autosize=yes )
table(column=(type=char(4) updatewhereclause=yes name=type dbname=\"pipes.type\" )
 column=(type=datetime updatewhereclause=yes name=date_of_change dbname=\"pipes.date_of_change\" )
 column=(type=long updatewhereclause=yes name=change_of_length dbname=\"pipes.change_of_length\" )
 retrieve=\"SELECT type, installed as date_of_change, length change_of_length
from pipes
where (installed BETWEEN :date_start AND :date_end) OR 
    ((installed < :date_start) AND (isnull (removed, :date_end) >= :date_start))
union all
select type, isnull (removed, dateadd (day, 1, :date_end)), (length * -1)
from pipes
where (installed BETWEEN :date_start AND :date_end) OR 
    ((installed < :date_start) AND (isnull (removed, :date_end) >= :date_start))
order by date_of_change, type\" filter=\" date_of_change <=  date_end \"arguments=((\"date_start\", date),(\"date_end\", date))  sort=\"type A date_of_change A \" )
group(level=1 header.height=76 trailer.height=0 by=(\"type\" ) header.color=\"536870912\" header.transparency=\"0\" header.gradient.color=\"8421504\" header.gradient.transparency=\"0\" header.gradient.angle=\"0\" header.brushmode=\"0\" header.gradient.repetition.mode=\"0\" header.gradient.repetition.count=\"0\" header.gradient.repetition.length=\"100\" header.gradient.focus=\"0\" header.gradient.scale=\"100\" header.gradient.spread=\"100\" trailer.color=\"536870912\" trailer.transparency=\"0\" trailer.gradient.color=\"8421504\" trailer.gradient.transparency=\"0\" trailer.gradient.angle=\"0\" trailer.brushmode=\"0\" trailer.gradient.repetition.mode=\"0\" trailer.gradient.repetition.count=\"0\" trailer.gradient.repetition.length=\"100\" trailer.gradient.focus=\"0\" trailer.gradient.scale=\"100\" trailer.gradient.spread=\"100\" )
text(band=header alignment=\"2\" text=\"Type\" border=\"0\" color=\"33554432\" x=\"5\" y=\"4\" height=\"64\" width=\"224\" html.valueishtml=\"0\"  name=type_t visible=\"1\"  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\" )
text(band=header alignment=\"2\" text=\"From\" border=\"0\" color=\"33554432\" x=\"334\" y=\"4\" height=\"64\" width=\"137\" html.valueishtml=\"0\"  name=t_1 visible=\"1\"  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\" )
text(band=header alignment=\"2\" text=\"To\" border=\"0\" color=\"33554432\" x=\"814\" y=\"0\" height=\"64\" width=\"96\" html.valueishtml=\"0\"  name=t_2 visible=\"1\"  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\" )
column(band=header.1 id=1 alignment=\"0\" tabsequence=32766 border=\"0\" color=\"33554432\" x=\"9\" y=\"0\" height=\"64\" width=\"224\" format=\"[general]\" html.valueishtml=\"0\"  name=type visible=\"1\" edit.limit=4 edit.case=any edit.autoselect=yes edit.autohscroll=yes  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\" )
compute(band=detail alignment=\"0\" expression=\"if (type = type[1] and getrow() < rowcount() and date_of_change[1] <= date_end, RelativeDate(date_of_change[1], -1),  date_end )\"border=\"0\" color=\"33554432\" x=\"837\" y=\"0\" height=\"64\" width=\"347\" format=\"[SHORTDATE]\" html.valueishtml=\"0\"  name=date_to visible=\"1~tif (date_of_change =  date_of_change [1] and  type = type[1], 0, 1)\"  resizeable=1  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\"  height.autosize=yes)
compute(band=detail alignment=\"0\" expression=\"cumulativesum ( change_of_length FOR GROUP 1)\"border=\"0\" color=\"33554432\" x=\"1417\" y=\"0\" height=\"64\" width=\"215\" format=\"[GENERAL]\" html.valueishtml=\"0\"  name=installed_length visible=\"1~tif (date_of_change =  date_of_change [1] and  type = type[1], 0, 1)\"  resizeable=1  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\"  height.autosize=yes)
compute(band=detail alignment=\"0\" expression=\"if (date_of_change < date_start, date_start, date_of_change)\"border=\"0\" color=\"33554432\" x=\"320\" y=\"8\" height=\"64\" width=\"311\" format=\"[SHORTDATE]\" html.valueishtml=\"0\"  name=date_from visible=\"1~tif (date_of_change =  date_of_change [1] and  type = type[1], 0, 1)\"  resizeable=1  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\"  height.autosize=yes)
column(band=detail id=2 alignment=\"0\" tabsequence=32766 border=\"0\" color=\"33554432\" x=\"1915\" y=\"8\" height=\"64\" width=\"352\" format=\"[shortdate]\" html.valueishtml=\"0\"  name=date_of_change visible=\"0\"  resizeable=1 height.autosize=yes edit.limit=0 edit.case=any edit.autoselect=yes edit.autohscroll=yes  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\" )
column(band=detail id=3 alignment=\"1\" tabsequence=32766 border=\"0\" color=\"33554432\" x=\"2304\" y=\"8\" height=\"64\" width=\"288\" format=\"[General]\" html.valueishtml=\"0\"  name=change_of_length visible=\"0\"  resizeable=1 height.autosize=yes edit.limit=0 edit.case=any edit.autoselect=yes edit.autohscroll=yes  font.face=\"Tahoma\" font.height=\"-10\" font.weight=\"400\"  font.family=\"2\" font.pitch=\"2\" font.charset=\"0\" background.mode=\"1\" background.color=\"536870912\" background.transparency=\"0\" background.gradient.color=\"8421504\" background.gradient.transparency=\"0\" background.gradient.angle=\"0\" background.brushmode=\"0\" background.gradient.repetition.mode=\"0\" background.gradient.repetition.count=\"0\" background.gradient.repetition.length=\"100\" background.gradient.focus=\"0\" background.gradient.scale=\"100\" background.gradient.spread=\"100\" tooltip.backcolor=\"134217752\" tooltip.delay.initial=\"0\" tooltip.delay.visible=\"32000\" tooltip.enabled=\"0\" tooltip.hasclosebutton=\"0\" tooltip.icon=\"0\" tooltip.isbubble=\"0\" tooltip.maxwidth=\"0\" tooltip.textcolor=\"134217751\" tooltip.transparency=\"0\" transparency=\"0\" )
htmltable(border=\"1\" )
htmlgen(clientevents=\"1\" clientvalidation=\"1\" clientcomputedfields=\"1\" clientformatting=\"0\" clientscriptable=\"0\" generatejavascript=\"1\" encodeselflinkargs=\"1\" netscapelayers=\"0\" pagingmethod=0 generatedddwframes=\"1\" )
xhtmlgen() cssgen(sessionspecific=\"0\" )
xmlgen(inline=\"0\" )
xsltgen()
jsgen()
export.xml(headgroups=\"1\" includewhitespace=\"0\" metadatatype=0 savemetadata=0 )
import.xml()
export.pdf(method=0 distill.custompostscript=\"0\" xslfop.print=\"0\" )
export.xhtml()
    
您的意思是说在2月(您的日期为DDMMYYY格式)中PT1的长度应该为负数,这样,如果您要运行该年度的第一季度的报告,则将减去2月份移除的2000英尺从一月份安装的PT1的2400英尺开始,到整个季度PT1的净安装长度为400英尺?如果是这样,您可以将其作为两个内联或永久视图的交集,一个用于安装,一个用于删除,类型和(提取的)时间段是联接列,从每种类型的安装长度中减去每种类型的每种长度的删除长度每个周期以获得每种类型每个周期的净安装长度。安装和删除之间的左连接。 如果您还需要跟踪贵公司不一定安装的管道的拆除情况-例如有一个删除了PT77的记录,但没有安装任何PT77的记录,您可以将其作为两个内联或永久视图的UNION(一个用于安装,一个用于删除,将删除转换为负长度)来解决。那么您将使UNION ALL查询本身进入一个内联视图,在该视图中您将按句点按类型分组并求和长度。     
您的样本结果似乎没有任何意义。这个
Type    From         To            Length
 PT2     01/02/2011   28/02/2011    4000
 PT1     01/02/2011   14/02/2011    2400 
 PT1     14/02/2011   24/02/2011    4400 
 PT1     25/02/2011   28/02/2011    2400
没有显示一月或二月安装了多少PT1管道。 以下查询显示每月安装的管道总长度,每种类型一行。
select type, 
       extract(year from installed) || \'-\' || extract(month from installed) as year_month, 
       sum(length) 
from pipes
group by type, year_month
order by year_month, type
退货
PT1   2011-1   2400
PT2   2011-1   4000
PT1   2011-2   2000
以后。 。 。 对于任何给定日期的管道总长度,我可能会使用这样的内容。
select p.type, 
       \'2011-02-28\' as effective_date, 
       (select sum(length)
         from pipes 
         where installed <= \'2011-02-28\'
           and type = p.type) as installed,
       (select sum(length)
        from pipes
        where removed <= \'2011-02-28\'
          and type = p.type) as removed
from pipes p
group by p.type, effective_date
order by type
该查询返回
type  effective_date   installed  removed
PT1   2011-02-28       4400       2000
PT2   2011-02-28       4000
    

要回复问题请先登录注册