2013-02-18 99 views
1

樣本數據已更新 - 我跳上證實與MSSQL查詢組數據援助

之前使用SQL服務器發佈數據槍,我已經返回了以下數據:

select id, dateofservice, first, second, third, fourth, fn, ln 
from servicesTbl 

的樣本數據:

id dateofservice first second third fourth fn  ln  
------------------------------------------------------------------- 
1 2/01/2013  Y  N  N  Y  John Doe  
2 2/01/2013  N  N  Y  Y  Sue  Fisher  
2 2/01/2013  Y  N  N  N  Sue  Fisher  
3 2/01/2013  Y  N  N  Y  Daivd Smith  
3 2/01/2013  N  N  Y  N  Daivd Smith  
4 2/01/2013  N  N  N  N  Bob  Denver  

我需要知道如何寫我的查詢因此T帽子蘇費舍爾和大衛·史密斯的記錄都在一行意味着輸出應該是這樣的:

1 2/01/2013  Y  N  N  Y  John Doe  
2 2/01/2013  Y  N  Y  Y  Sue  Fisher  
3 2/01/2013  Y  N  Y  Y  Daivd Smith  
4 2/01/2013  N  N  N  N  Bob  Denver  

此查詢工作不適合我,我不知道該怎麼做才能在格式輸出我想要。

select id, dateofservice, first, second, third, fourth, fn, ln  
from servicesTbl  
group by ln 

樣本數據已更新 - 我偷步上證實

+0

輸出什麼你期待的其他列(例如,第一,第二,第三)?這些應該總結一下嗎? – ChrisC 2013-02-18 19:00:32

+0

在dateofservice之後的每列放置最大值,例如最大(第一)等等。 – muhmud 2013-02-18 19:02:37

+0

@ChrisC沒有得出結論,1和0是yes/no值。爲了以這種方式獲得Sue Fisher的數據,她的記錄在兩個不同的時間更新,由於某種原因,現在必須輸入數據庫(這是我們正在處理的一個單獨問題)。我只需要Sue Fisher的記錄在一條線上,而不是兩條,所以價值應該合併,而不是總結。希望有所幫助。 – HPWD 2013-02-18 19:04:26

回答

1
SELECT 
    id, 
    dateofservice, 
    (CASE WHEN SUM(first) > 0 THEN 1 ELSE 0 END) AS first, 
    (CASE WHEN SUM(second) > 0 THEN 1 ELSE 0 END) AS second, 
    (CASE WHEN SUM(third) > 0 THEN 1 ELSE 0 END) AS third, 
    (CASE WHEN SUM(fourth) > 0 THEN 1 ELSE 0 END) AS fourth, 
    fn, 
    ln 
    OVER (PARTITION BY id) 
FROM servicesTbl 

這可能會工作太之前發佈的數據,想着它,它是一個小更簡潔:

SELECT 
    id, 
    dateofservice, 
    MAX(first) AS first, 
    MAX(second) AS second, 
    MAX(third) AS third, 
    MAX(fourth) AS fourth, 
    fn, 
    ln 
    OVER (PARTITION BY id) 
FROM servicesTbl 

的常用方法的東西像MySQL這樣做是:

SELECT 
    id, 
    dateofservice, 
    MAX(first) AS first, 
    MAX(second) AS second, 
    MAX(third) AS third, 
    MAX(fourth) AS fourth, 
    fn, 
    ln 
FROM servicesTbl 
GROUP BY id 

......但我想我說得對,MSSQL會抱怨fn,如果不是聚合函數或不在GROUP BY子句中:使用上面的OVER PARTITION方法應該可以解決這個問題。

請注意,這是未經測試的,因爲我沒有MSSQL,但應指向正確的方向。

+0

我正在使用MSSQL 2005,而不是MySQL。 – HPWD 2013-02-18 20:42:50

+0

樣本數據已被更新 - 我在發佈數據之前跳過槍確認 – HPWD 2013-02-18 20:55:14

+0

我明白了,這就是爲什麼我說「......但我認爲我說得對,說MSSQL會抱怨......」等。 – ChrisC 2013-02-18 22:34:57

0
select id,CONVERT(VARCHAR(10),Dateofservice,111) as Dateofservice, 
MAX(first) as first , 
MAX(second) as second, 
MAX(third) as third, 
MAX(fourth) as fourth, fn, ln from dbo.ttest 
group by id,CONVERT(VARCHAR(10),Dateofservice,111),fn, ln 

我已將表格命名爲tttest,您可以使用表名稱。另外我使用了隨機日期格式來改變它以適合自己。

+0

樣本數據已被更新 - 在確認之前我發佈了數據。 – HPWD 2013-02-18 20:56:30

0

使用CF,我能夠完成一個組,然後查詢

<table> 
    <cfoutput query='rsData' group="id"> 
     <cfoutput> 
      <tr> 
       <td>#dateformat(dateofservice,'mm/dd/yyyy')#</td> 
       <td>#first#</td> 
       <td>#second#</td> 
       <td>#third#</td> 
       <td>#fourth#</td> 
       <td>#fn#</td> 
       <td>#ln#</td> 
      </tr> 
     </cfoutput> 
    </cfoutput> 
</table>