2013-07-03 73 views
-1

我有一個動態報表查詢作爲數據源。 結果至今是:Tree/Group UNION SQL-Query報表

enter image description here

沒有與UNION連接3個查詢。第1行爲公司累計的所有數據。第2行所有數據爲位置,第3行爲詳細數據。

它就像一棵樹。但我的問題是,積累不正確(AnzahlMinuten)。是否有其他方式在動態報告中顯示此數據。這3個查詢可能非常緊張。我也使用RANK()函數,因爲我使用許可證的時候有多個條目。

如果沒有其他更簡單的解決方案,那麼在與union的連接查詢中我的錯在哪裏,以便累積不正確?

SELECT Gesellschaftsname,Standortname,Lizenzname,Abteilungsname,Kostenstelle,  
COUNT(DISTINCT username) AS AnzahlUser, 
SUM(DISTINCT RuntimeMinute) AS AnzahlMinuten, 

1 FROM (SELECT * FROM(SELECT DISTINCT Standortname, 
         DATEPART(YEAR,PK_Date) AS Jahr, 
         DATEPART(month,PK_Date) AS Monat, 
         Lizenzname,COUNT(DISTINCT username) AS AnzUser, 
         SUM(DISTINCT DATEDIFF(minute,starttime ,pk_date)) AS RuntimeMinute, 
         starttime, 
         username, 
         pk_date, 
         Abteilungsname, 
         Gesellschaftsname, 
         Kostenstelle, 
         RANK() Over (PARTITION BY starttime ORDER BY pk_date DESC) As Rank 
         FROM BenutzerLizenz,Benutzer,Abteilung,Lizenz,Standort,Gesellschaft,Kostenstelle 
         WHERE BenutzerLizenz.PK_ID_user=Benutzer.PK_ID_user AND BenutzerLizenz.PK_ID_lic=Lizenz.PK_ID_lic AND PK_ID_standort=FK_ID_standort AND PK_ID_Abteilung = FK_ID_Abteilung AND PK_ID_Gesellschaft = FK_ID_Gesellschaft AND PK_ID_Kostenstelle = FK_ID_Kostenstelle AND 
         DATEPART(month,PK_Date) IN ('06','07') AND 
         DATEPART(YEAR,PK_Date) = '2013' AND 
         Lizenzname IN ('DESIGNER','iman_nth') AND 
         Standortname IN ('Unterlüß','Neuenburg') 
         GROUP BY Standortname, Lizenzname, starttime, pk_date, username ,Abteilungsname, Kostenstelle, Gesellschaftsname) tmp 
         WHERE Rank = 1)tmp2 GROUP BY Standortname,Lizenzname,Abteilungsname, Kostenstelle, Gesellschaftsname 

UNION 

SELECT Gesellschaftsname,'','','','', 
COUNT(DISTINCT username) AS AnzahlUser, 
SUM(DISTINCT RuntimeMinute) AS AnzahlMinuten,2 
FROM (SELECT * FROM(SELECT DISTINCT Gesellschaftsname, 
         DATEPART(YEAR,PK_Date) AS Jahr, 
         DATEPART(month,PK_Date) AS Monat, 
         COUNT(DISTINCT username) AS AnzUser, 
         SUM(DISTINCT DATEDIFF(minute,starttime ,pk_date)) AS RuntimeMinute, 
         starttime, 
         username, 
         pk_date, 
         RANK() Over (PARTITION BY starttime ORDER BY pk_date DESC) As Rank 
         FROM BenutzerLizenz,Benutzer,Lizenz,Standort,Gesellschaft 
         WHERE BenutzerLizenz.PK_ID_user=Benutzer.PK_ID_user AND BenutzerLizenz.PK_ID_lic=Lizenz.PK_ID_lic AND PK_ID_Gesellschaft = FK_ID_Gesellschaft AND 
         DATEPART(month,PK_Date) IN ('06','07') AND 
         DATEPART(YEAR,PK_Date) = '2013' AND 
         Lizenzname IN ('DESIGNER','iman_nth') AND 
         Standortname IN ('Unterlüß','Neuenburg') 
         GROUP BY Gesellschaftsname,starttime, pk_date, username) tmp 
         WHERE Rank = 1)tmp2 GROUP BY Gesellschaftsname 

UNION 

SELECT '',Standortname,'','','', 
COUNT(DISTINCT username) AS AnzahlUser, 
SUM(DISTINCT RuntimeMinute) AS AnzahlMinuten,3 
FROM (SELECT * FROM(SELECT DISTINCT Standortname, 
         DATEPART(YEAR,PK_Date) AS Jahr, 
         DATEPART(month,PK_Date) AS Monat, 
         COUNT(DISTINCT username) AS AnzUser, 
         SUM(DISTINCT DATEDIFF(minute,starttime ,pk_date)) AS RuntimeMinute, 
         starttime, 
         username, 
         pk_date, 
         RANK() Over (PARTITION BY starttime ORDER BY pk_date DESC) As Rank 
         FROM BenutzerLizenz,Benutzer,Abteilung,Lizenz,Standort 
         WHERE BenutzerLizenz.PK_ID_user=Benutzer.PK_ID_user AND BenutzerLizenz.PK_ID_lic=Lizenz.PK_ID_lic AND PK_ID_standort=FK_ID_standort AND PK_ID_Abteilung = FK_ID_Abteilung AND 
         DATEPART(month,PK_Date) IN ('06','07') AND 
         DATEPART(YEAR,PK_Date) = '2013' AND 
         Lizenzname IN ('DESIGNER','iman_nth') AND 
         Standortname IN ('Unterlüß','Neuenburg') 
         GROUP BY Standortname, starttime, pk_date, username) tmp 
         WHERE Rank = 1)tmp2 GROUP BY Standortname 
         ORDER BY 2 

回答

1

我認爲主要問題是使用「不同」。這不是一個編碼問題。當在多個分組級別上求和時,子組的總數可能大於頂級組的總數。例如:

GroupId Value 
1  1 
1  2 
1  3 
2  2 
2  4 
2  5 

薩姆(不同值)上組1 = 6
上組2 總和(不同值)= 11
上兩組 總和(不同值)= 15

另外,一般來說,這聽起來像是在尋求一種更好的方法來解決單個記錄集中多個分組級別的問題。我做了這樣的事情在以前的工作:

sql fiddle

的想法是,你在一個CTE首先建立可能的組的列表作爲

Level1 Level2 Level3 
A  NULL NULL 
A  AA  NULL 
A  AB  NULL 
A  AA  AAA 
A  AA  AAB 
A  AB  ABA 
A  AB  ABB 

然後加入該對你的數據三級,按Level1,Level2,Level3分組。這是一個更清潔。

+0

謝謝你到目前爲止。我可以按照你的例子不同。在我編輯的例子中,我試圖不使用不同的值來總結值,但它並沒有幫助我,值仍然是錯誤的。如果沒有解決方案,我必須嘗試第二個示例 – janor

+0

我刪除了外部SELECTS SUM(RuntimeMinute)AS AnzahlMinuten中的所有'DISTINCT'關鍵字,現在它似乎可以工作。 – janor

+0

很高興聽到它,簡! –