2011-04-12 62 views
1

我有一個包含安裝在某個位置的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/201128/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
同爲PT1總長度:從2月2日開始安裝PT1管道,所以2400但是在15日的額外長度爲1000的2支PT1管安裝這樣的第15到第25個期間PT1管的總長度爲4400
這些2管25號除去,從而25結束月它再次2400。
我希望現在可以多一點意義。

我與如何做到這一點的SQL掙扎,這是一個報告,並通常有數以百計的這些管道安裝在任何給定的月份。

它是在一個PowerBuilder應用程序使用,因此,如果您知道任何數據窗口掛羊頭賣狗肉,這可能有助於隨時分享。

+0

你的意思是,在二月(您日期在DDMMYYY格式)PT1的長度應爲負數,因此,如果您要在今年的第一季度運行報告顯示,2000英尺從1月份安裝的PT1的2400英尺中減去2月份去除的PT1的淨安裝長度是多少? – Tim 2011-04-12 11:24:01

+0

對不起,無法刪除這個 - StackOverflow並沒有給你太多的時間來思考,因爲你輸入,或時間被電話打斷,然後關閉改變/刪除評論的能力。 – Tim 2011-04-12 11:39:22

回答

1

有太多的樂趣!我已經採取了一些自由,例如假設排序順序,並將您的查詢條件更改爲日期範圍而不是聲明一個月。首先,我將數據集從日期範圍更改爲更改日期和更改數量(安裝日期的正值,刪除日期的負值)。

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 

而且,是的,在參數前的冒號(我已經關掉你開始和結束日期...我更容易,現在你可以做6個月報告)意味着我借力數據窗口。 (我敢打賭,有人可以創建一個純粹的SQL方法與上述概念的變化,但我會與我所知道的。)

將SQL加載到DataWindow(我使用自由格式),並可選地設置一個客戶端按種類和日期(皮帶和吊帶)進行分類。該數據集包括空刪除了日期爲改變您的查詢範圍結束後的第二天,所以創建一個過濾器,以排除那些空值:

date_of_change <= date_end 

創建基於類型的一組,並把類型分爲組頭。

在詳細信息區域(其中,所有後續的控制會),創建一個名爲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和類型;你只需要最後一行顯示當前所有活動的總和。

將細節帶拖動到零高度,並使細節帶自動調整高度。

這會給你一個你所追求的版本。 FWIW,我試着按日期排序(不清楚這是你想要的,還是先按類型排序),但是打破了CumulativeSum()的功能。也許別人可以弄明白。

祝你好運,

特里。

P.S.如果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() 
+0

哇,謝謝你的廣泛答案!我已經開始使用存儲過程來開始和結束了。我一定會檢查一下。 – klennepette 2011-04-13 08:12:18

0

您的示例結果似乎沒有意義。這

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 

不顯示1月或2月安裝了多少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 
+0

感謝您的回答,我已經澄清了預期的結果。儘管一月份安裝了一些管道,但它們仍在2月份出現。所以他們需要考慮。 – klennepette 2011-04-12 11:54:30

0

你的意思是在二月(您日期在DDMMYYY格式)PT1的長度應爲負數,因此,如果您要運行報告對於今年第一季度,2月份去除的2000英尺將從1月份安裝的PT1的2400英尺中減去,PT1在本季度的淨安裝長度爲400英尺?如果是這樣,可以將它作爲兩個內聯視圖或持久視圖的交集,一個用於刪除刪除的類型和(提取的)時間段作爲聯接列,從每個類型的已安裝長度中減去每個類型每個類型的已刪除長度得到每個時期每種類型的淨安裝長度。安裝和刪除之間的左連接。

如果您還需要跟蹤移除您的公司未必安裝的管道,有一個PT77被刪除的記錄,但沒有安裝PT77的記錄,你可以將它作爲兩個內聯或永久視圖的聯合,一個用於安裝,一個用於清除,清除被轉換爲負值;那麼你會讓UNION ALL將自己查詢成一個內聯視圖,在那裏你將按照週期類型進行分組並且總和長度。

+0

感謝您的回答,我已經澄清了我的預期結果。我不想追蹤一個月內安裝了多少,我想知道當月的管道總量。我應該更清楚一點。 – klennepette 2011-04-12 11:56:44