Günlük üretim ve benzeri verilerin hesaplanmasında Database’e kayıtlı verilerin farklarını elde etmemiz gerekir. Aşağıda açıklayacağım SQL sorgusu ile bu bilgilere bağlı rapor oluşturabilirsiniz. Bu sorgular WinTr scada rapor modülüne uygun olarak hazırlanmıştır.

İlk sorgumuz scada rapor modülü tarafından standart olarak üretilen belli tarihler arasındaki kayıtları getiren sorgudur.

SELECT [DateTime],[Tag_1],[Tag_2],[Tag_3] FROM Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’

Bu sorguyu kısaca açıklayalım. Select komutundan sonra datebase’deki kolon isimlerini yazıyoruz. From ifadesi ise database’deki tablo ismidir. WinTr standart olarak Table1 isimli tabloyu oluşturur. Where komutu ise belli tarih aralığını getirmek için sorguya eklenen bir kısıtlamadır. Where komutunu kullanmaydık tüm database’i getirecekti. StartDate ve EndDate tarih seçimi yapabilmemiz için internal scada taglarıdır.

Yukarıdaki sorgu ile tablomuz oluşturuldu. Bu tablonun altına yeni bir satırda tablodaki ilk değer ile son değer arasındaki farkı getireceğiz. Öncelikle UNION ALL komutunu anlayalım. Bu komut Tablonun altında yeni bir tablo oluşturmak için kullanılır. Her iki tablo scada içersinde tek tablo olarak görünür. Her iki tablodada kolon tipleri aynı olmalıdır. Örneğin ilk tablomuzun ilk kolonu Datetime tipinde olduğu için yeni tablodada Datetime tipinde bir değer bulunmalı. İlk sorgumuzun altına aşağıdaki satırları ekleyelim.

UNION ALL

SELECT (select Top 1 DateTime from Table1 ORDER BY DateTime DESC)

Yukarıda görüldüğü gibi UNION ALL ile ikinci bir tablo oluşturuldu ve ilk kolon DateTime için oluşturuldu. Bu kısımda Top 1 komutu ile ilk veri getirilicektir. Ancak sorgu sonuna “ORDER BY DateTime DESC” komutunu ekleyerek son kayıdın getirilmesi sağlandı. Şimdi asıl hedefimiz olan belli tarihler arasındaki ilk kayıt ile son kayıt arasında ki farkı bulan sorguyu ekleyelim.

(select Top 1 Tag_1 from Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ ORDER BY Tag_1 DESC) – (select Top 1 Tag_1 from Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ )

Epey uzun bir sorgu oldu, sorgunun tamamı çok daha uzun. Bu sorgu eksi(-) işareti ile son değerden ilk değeri çıkartıyor. İlk ve son değerler belirttiğimiz tarih aralığının ilk ve son değerleridir. Sorgunun sonunda parantez’den önce bir boşluk bırakılması zorunludur. Aşağıda sorgunun tamamı birlekte olarak verilmiştir.

SELECT [DateTime],[Tag_1],[Tag_2],[Tag_3] FROM Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ UNION ALL SELECT (select Top 1 DateTime from Table1 ORDER BY DateTime DESC),(select Top 1 Tag_1 from Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ ORDER BY Tag_1 DESC) – (select Top 1 Tag_1 from Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ ),(select Top 1 Tag_2 from Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ ORDER BY Tag_2 DESC) – (select Top 1 Tag_2 from Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ ),(select Top 1 Tag_3 from Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ ORDER BY Tag_3 DESC) – (select Top 1 Tag_3 from Table1 WHERE [DateTime] >= ‘StartDate’ And [DateTime] <= ‘EndDate’ )

Biraz dah basit olması için başlangıç ve bitiş tarihleri bulunmayan sorguyuda aşağıya ekliyorum.

SELECT [DateTime],[Tag_1],[Tag_2],[Tag_3] FROM Table1 UNION ALL SELECT Null,(select Top 1 Tag_1 from Table1 ORDER BY Tag_1 DESC) – (select Top 1 Tag_1 from Table1),(select Top 1 Tag_2 from Table1 ORDER BY Tag_2 DESC) – (select Top 1 Tag_2 from Table1),(select Top 1 Tag_3 from Table1 ORDER BY Tag_3 DESC) – (select Top 1 Tag_3 from Table1)