web-dev-qa-db-ja.com

独自の列ではなく、価格の列の下に合計を追加する

私は私のデータベースでこの選択クエリを実行しています:

Select Item.ItemId, Item.ItemDescription, Bid.BidPrice, bid.BidDate,
Sum(bid.bidPrice) over () as TotalBids
from Bid
inner join Item on bid.ItemId=Item.ItemId
where BidDate between '2016-08-24' and '2017-11-15'

私は以下の結果を得ています:

ItemId  ItemDescription BidPrice    BidDate     TotalBids
1       Frame           35         2016-08-24   3624
4       Wooden chair    40         2016-10-25   3624
2       Car             3000       2017-10-26   3624
3       Stand Fan       29         2017-10-30   3624
5       Black Sofa      400        2017-11-11   3624
6       Cabinet         120        2017-11-15   3624

私の質問は次のとおりです。各行に合計があるTotal Bids列の代わりに、BidPrice列の下部に1つの合計しか表示されない可能性はありますか?

2
Kevin

GROUP BY GROUPING SETSNULLセット

SELECT itemid, itemdescription, biddate, totalbids, sum(bidprice)
FROM f
GROUP BY GROUPING SETS ( (itemid,itemdescription,biddate,totalbids), () );
 itemid | itemdescription |  biddate   | totalbids | sum  
--------+-----------------+------------+-----------+------
      1 | Frame           | 2016-08-24 |      3624 |   35
      2 | Car             | 2017-10-26 |      3624 | 3000
      3 | Stand Fan       | 2017-10-30 |      3624 |   29
      4 | Wooden chair    | 2016-10-25 |      3624 |   40
      5 | Black Sofa      | 2017-11-11 |      3624 |  400
      6 | Cabinet         | 2017-11-15 |      3624 |  120
        |                 |            |           | 3624
(7 rows)

PostgreSQLで動作することが確認されています。 SQL Server 2014およびSQL Server 2016。

CREATE TABLE f(
  itemid int,
  itemdescription varchar(255),
  bidprice int,
  biddate date,
  totalbids int
)
INSERT INTO f VALUES
    ( 1, 'Frame       ', 35  , '2016-08-24', 3624 ),
    ( 4, 'Wooden chair', 40  , '2016-10-25', 3624 ),
    ( 2, 'Car         ', 3000, '2017-10-26', 3624 ),
    ( 3, 'Stand Fan   ', 29  , '2017-10-30', 3624 ),
    ( 5, 'Black Sofa  ', 400 , '2017-11-11', 3624 ),
    ( 6, 'Cabinet     ', 120 , '2017-11-15', 3624 );

PostgreSQLのドキュメントはこれをはるかによく説明しています

これを行う別の方法は、UNIONを使用することです。

WITH t AS (SELECT * FROM f)
SELECT *
FROM f
UNION ALL
  SELECT null, null, (SELECT sum(bidprice) FROM f), null, null;

クエリの場合、最初のメソッドは次のようになります。

SELECT Item.ItemId, Item.ItemDescription, Bid.BidPrice, bid.BidDate, sum(bidPrice)
FROM Bid
INNER JOIN Item ON bid.ItemId=Item.ItemId
WHERE BidDate between '2016-08-24' and '2017-11-15'
GROUP BY GROUPING SETS ( (Item.ItemId, Item.ItemDescription, Bid.BidPrice, bid.BidDate), () )
5
Evan Carroll