web-dev-qa-db-ja.com

SQL Server:WHERE句でMAXなどの集計関数を使用する方法

このレコードの最大値を取得します。私を助けてください:

SELECT rest.field1 
    FROM mastertable AS m
    INNER JOIN  (
        SELECT t1.field1 field1, 
               t2.field2
            FROM table1 AS T1 
            INNER JOIN table2 AS t2 ON t2.field = t1.field 
            WHERE t1.field3=MAX(t1.field3)
        --                  ^^^^^^^^^^^^^^  Help me here.
    ) AS rest ON rest.field1 = m.field
26
Geetha

サブクエリを使用できます...

WHERE t1.field3 = (SELECT MAX(st1.field3) FROM table1 AS st1)

しかし、実際には、これをON句のANDとして、where句からjoinステートメントに移動します。

23
dlamblin

お気づきのとおり、WHERE句では、その中で集計を使用することはできません。それがHAVING句の目的です。

HAVING t1.field3=MAX(t1.field3)
38
Powerlord

Having句でmaxを使用する正しい方法は、最初に自己結合を実行することです。

select t1.a, t1.b, t1.c
from table1 t1
join table1 t1_max
  on t1.id = t1_max.id
group by t1.a, t1.b, t1.c
having t1.date = max(t1_max.date)

以下は、サブクエリとの結合方法です。

select t1.a, t1.b, t1.c
from table1 t1
where t1.date = (select max(t1_max.date)
                 from table1 t1_max
                 where t1.id = t1_max.id)

マルチテーブル結合を処理する場合、集約を使用する前に、必ず単一のデータセットを作成してください。

select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
  on t1.id = t2.id
join table2 t3
  on t1.id = t3.id


select a, b, c
from #dataset d
join #dataset d_max
  on d.id = d_max.id
having d.date = max(d_max.date)
group by a, b, c

サブクエリのバージョン:

select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
  on t1.id = t2.id
join table2 t3
  on t1.id = t3.id


select a, b, c
from #dataset d
where d.date = (select max(d_max.date)
                from #dataset d_max
                where d.id = d_max.id)
7
metrix
SELECT rest.field1
FROM mastertable as m
INNER JOIN table1 at t1 on t1.field1 = m.field
INNER JOIN table2 at t2 on t2.field = t1.field
WHERE t1.field3 = (SELECT MAX(field3) FROM table1)
4
Tim Santeford

はい、単純なパラメーターでデータをフィルター処理するだけであるため、Group by句の後にhaving句を使用する必要がありますが、group byに続いてHaveingステートメントを使用すると、データをグループ化し、集計に基づいてフィルター処理することができます関数......

1
Rohit

ただし、クエリビルダではエラーメッセージが表示されます。 SqlServerCe 2008を使用しています。

SELECT         Products_Master.ProductName, Order_Products.Quantity, Order_Details.TotalTax, Order_Products.Cost, Order_Details.Discount, 
                     Order_Details.TotalPrice
FROM           Order_Products INNER JOIN
                     Order_Details ON Order_Details.OrderID = Order_Products.OrderID INNER JOIN
                     Products_Master ON Products_Master.ProductCode = Order_Products.ProductCode
HAVING        (Order_Details.OrderID = (SELECT MAX(OrderID) AS Expr1 FROM Order_Details AS mx1))

@powerlordによると、WHEREをHAVINGに置き換えました。しかし、まだエラーが表示されます。

クエリの解析エラー。 [トークン行番号= 1、トークン行オフセット= 371、エラーのトークン= SELECT]

0
Kamal