2017-02-27 51 views
0

我有一個MS SQL存儲過程,它使用遊標循環選擇語句的記錄。當我循環讀取每條記錄時,它可能是3,然後是3,也可能是3,然後是4,然後是5,然後是3.它可以是一個記錄,也可以是多個記錄。有沒有辦法循環記錄集並識別不同的值?

我需要知道的是所有的值是相同還是不同?只要他們相同或不同,我不在乎他們是什麼。如果我正在用客戶端代碼來做這件事,我會使用一個列表,看看這個值是否在列表中,然後當我完成的時候,我會計算出這些值,如果一個值超過1則不同。

 DECLARE TC CURSOR LOCAL 
      FOR SELECT ProgramID FROM tblPublications 
       OPEN TC 
       FETCH NEXT FROM TC INTO @ProgramID 
       WHILE @@FETCH_STATUS = 0 
       BEGIN 
       Print @ProgramID 
       --Same or Different then the last one??? 


       FETCH NEXT FROM TC2 INTO @ProgramID 
       END 
       CLOSE TC 
       DEALLOCATE TC 
     END 

如果它們是相同的話,我會更新記錄的一種方式,如果他們是不同的,那麼更新狀態記錄的另一種方式。

感謝

+0

有可能是一個更好的方法做,你沒有循環或光標在做什麼。你會擴展你的問題嗎? – SqlZim

+0

我們不希望在sql中計算值時使用循環。我們使用聚合而不是。像count(YourValue)。給我們一些關於數據和期望輸出的實際細節,我們可以提供幫助。這裏是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

我有一份屬於各個部門作者的出版物清單。如果所有作者都來自同一個部門,那麼如果更多的部門參與扭轉出版物,則該出版物被認爲是內部部門,那麼它被認爲是國際部門。我的記錄集包含基於PublicationID的部門/ programid,因此 - SELECT ProgramID其中,PublicationID = 12345 - 現在我需要查看ProgramID的相同或不同 – user1314159

回答

2

像這樣的東西(不涉及光標)吧?

select PubId, count(distinct ProgId) 
from tblPublications 
group by PubId 
2

您可以使用count(distinct col)獲得不同值的數列,並使用case表達式返回取決於它是否是1或更大的值。

select 
    PublicationId 
    , PublicationType = case 
     when count(distinct ProgramId) > 1 
     then 'inter' 
     else 'intra' 
     end 
from tblPublications 
where PublicationId = 12345 
group by PublicationId 
+0

您和Giorgos都很棒 - 難以調用正確的答案 – user1314159

+0

@ user1314159樂意幫忙! – SqlZim

+0

感謝您的回覆,請注意! –

0

您可以比較組中的ProgramID的最小值和最大值。 如果所有值都相同,則最大值將與最小值相同。

;with tblPublications(ProgramID,ID)AS(
select 'a',1 union 
select 'b',1 union 
select 'c',2 union 
select 'c',2 

select case when ISNULL(max(ProgramID),'')=ISNULL(min(ProgramID),'') then 'Same' else 'Different' end 
from tblPublications 
group by ID 
 
    (No column name) 
1 Different 
2 Same 

相關問題