2017-04-26 57 views
0

我不確定我的問題的最佳標題是什麼,但我會在下面解釋我的問題/問題:SQL - 對於查詢中的每個循環

我正在使用以下查詢,在那裏我過濾器在工作單,我推測這一切的歷史,這是我需要在我的報告中顯示:

select a.name, d.data, h.started, e.name, * from wshhistory h 
join asset a 
on a.uid = h.assetid 
join wshfld d 
on h.uid = d.wshhistid 
join fielddefinition f 
on d.flddefid = f.uid 
join enumlookup e 
on h.assetstatus = e.uid 
where h.shdid = '43FEB092-D3B1-4008-9C44-A3A249987849' order by a.name, h.started asc 

我的結果是好的,但...

enter image description here

什麼我需要的是每個(唯一)資產只有1行(最後/最上面一行),其他行全部爲列,這樣我們每個資產只有1行。 所以,我的報告是這樣的:

enter image description here

在vb.net我將與每個遍歷所有的資產去解決這個問題,但我的SQL知識是有限的,和我不知道如何在查詢中解決這個問題。

有什麼想法?

提前致謝!

+0

的可能的複製[選擇每個GROUP BY組第一排?](http://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group) –

+0

如果我想的名字(或資產ID)組,然後我得到的消息: 列「asset.name」在選擇列表中無效,因爲它不是在聚合˚F載unction或GROUP BY子句。 如果我想刪除所有這些選擇標準,並與去*然後我仍然得到同樣的錯誤信息,但與另一列(「wshhistory.uid」) – GertDeWilde

+1

如果是分組您是不是所有的列需要組聚集。你應該避免使用select *,無論如何,明確地命名列。 –

回答

2

要產生你願意,你可以使用條件聚集你說的輸出。像這樣的東西。

select a.name 
    , min(case when d.data = 'Pre Use' then d.data end) as PreUse 
    , min(case when d.data = 'Connected' then d.data end) as Connected 
    , min(case when d.data = 'Let Go' then d.data end) as LetGo 
    , min(case when d.data = 'Disconnected' then d.data end) as Disconnected 
from wshhistory h 
join asset a on a.uid = h.assetid 
join wshfld d on h.uid = d.wshhistid 
join fielddefinition f on d.flddefid = f.uid 
join enumlookup e on h.assetstatus = e.uid 
where h.shdid = '43FEB092-D3B1-4008-9C44-A3A249987849' 
group by a.name 
order by a.name 
+0

這適用於模擬他想要的結果,但不適用於查詢中選擇全部(*)。我喜歡使用windows函數(即row_number),因此您可以將第一條記錄的所有列都帶回來。 – KeithL

+0

@KeithL我同意,但在預期的結果很明顯,他們不需要每一列。 –

+0

*是爲了一些額外的信息,但不是我想要的報告。 所以這確實是我想要/需要的。對困惑感到抱歉。 多謝,你不想知道多少時間,我對這個細腰,和你有多少時間只是救了我! :) – GertDeWilde

0

嘗試支點:

WITH A AS(
SELECT a.name , d.data , h.started 
FROM wshhistory h 
    join asset a 
    on a.uid = h.assetid 
    join wshfld d 
    on h.uid = d.wshhistid 
    join fielddefinition f 
    on d.flddefid = f.uid 
    join enumlookup e 
    on h.assetstatus = e.uid 

WHERE h.shdid = '43FEB092-D3B1-4008-9C44-A3A249987849' 
) 
SELECT * FROM a 

PIVOT(MAX(startdate) FOR data IN ([Pre Use],[Connected],[Let Go],[Disconnected])) AS MaxStarted 

既然你沒有創建一些數據對我們來說,我不能對其進行測試,但它可能應該工作:)