2

Delphi アプリケーションを MySQL から SQL Server 2012 に移動しています。MySQL では、次のクエリがありました。

SELECT *,(XS+S+M+L+XL+XXL+[1Size]+Custom) as Total FROM StockData  
GROUP BY StyleNr,Customer,Color  
ORDER BY StyleNr,Customer,Color

そして、それは完璧に機能しました。しかし、Microsoft SQL Server 2012 では、このクエリは

メッセージ 8120、レベル 16、状態 1、行 1
列 'StockData.ID' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。

クエリを次のように変更すると:

SELECT *,([XS]+[S]+[M]+[L]+[XL]+[XXL]+[1Size]+[Custom])  total
 FROM [dbo].[stockdata]
 GROUP BY ID,StyleNr,Customer,Color
 ORDER BY StyleNr,Customer,Color

次に、次のエラーが表示されます。

メッセージ 8120、レベル 16、状態 1、行 1
列 'dbo.stockdata.XS' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。

何か案は?

テーブルのデザイン ビューは次のとおりです。

ここに画像の説明を入力

4

3 に答える 3

6

SQL Server は期待どおりに動作しています。SELECTリスト内のすべての項目を aGROUP BYまたは集計関数に含める必要があります。

SELECT *,(XS+S+M+L+XL+XXL+[1Size]+Custom) as Total 
FROM StockData  
-- GROUP BY ID,StyleNr,Customer,Color, XS,S,M,L,XL,XXL,[1Size],Custom
ORDER BY StyleNr,Customer,Color

または、次を使用できる場合があります。

SELECT StyleNr,Customer,Color, SUM(XS+S+M+L+XL+XXL+[1Size]+Custom) as Total 
FROM StockData  
GROUP BY StyleNr,Customer,Color
ORDER BY StyleNr,Customer,Color;
于 2012-12-29T14:32:02.423 に答える
1

このアプローチを使用することもできます。

with OrdinalOnGroup
(
    SELECT 
        Ordinal = rank() over(partition by StyleNr, Customer, Color order by id) 
        , *, (XS+S+M+L+XL+XXL+[1Size]+Custom) as Total 
    FROM StockData  
)
select * 
from OrdinalOnGroup
where Ordinal = 1;

PARTITION BY は、関連情報のグループ化を示します。これは、ウィンドウ処理と呼ばれます。

于 2012-12-29T14:41:07.247 に答える
1

集計クエリのすべての列は、集計関数または group by で使用する必要があります。ではなく、必要な列のみを選択してみてください。

これは集計を処理する SQL の標準的な方法であり、Oracle でも同様のエラーが発生します。

于 2012-12-29T14:31:45.950 に答える