在配置爲不區分大小寫的SQL Server上,當[n][var]char
列不是第一個group by
列時,group by
可能會有有趣的結果。從本質上講,它看起來像它遇到的第一個行(沒有訂單時「第一個」未定義):該分組獲勝。例如:如何規範逐列的大小寫?
select x.[day], x.[name], count(1) as [count]
from (
select 1 as [day], 'a' as [name]
union all select 1, 'A'
union all select 2, 'A'
union all select 2, 'a'
) x group by x.[day], x.[name]
返回,對我來說:
day name count
----------- ---- -----------
1 A 2
2 a 2
使用min(x.[name])
沒有任何效果,因爲分組已經發生了。
我不能在之前添加order by
,因爲這是非法的;並在之後添加order by
group by
只是定義了分組後的輸出順序 - 它仍然給出a
和A
。
所以:在這種情況下,是否有一種合理的方式來實現這一點,即所有分組的大小都至少保持一致? (我會離開的另一天被單獨運行相一致的問題)
所需的輸出,無論是:
day name count
----------- ---- -----------
1 A 2
2 A 2
或:
day name count
----------- ---- -----------
1 a 2
2 a 2
編輯:沒有在團體之間一致時摧毀大寫字母。所以沒有上/下。因此,如果其中一個組始終具有值BcDeF
,我希望該行的結果爲BcDeF
,而不是bcdef
或BCDEF
。
(1,'A'),(2,'a')',你會喜歡什麼輸出? (1,'A'),(2,'a'),(3,'A')'? (1,'A'),(1,'a'),(2,'A'),(2,'a')'? –
@AndriyM優秀的問題;也許這只是不可能在DB層解決;我想天真地我在想「無論是全部'a'還是全部'第二列',但... –
爲了完整起見,我最終通過對返回的結果進行歸一化,最終在調用站點」修復「了這一點。窗口函數的方法可能是最接近我需要的,但是*在我的場景中*(運行時生成的任意複雜的報告查詢)實現起來並不實際。 –