0

SQL Server で以下の形式のデータを照会する必要があります。

  • ID グループ価格
  • 1A10
  • 2A20
  • 合計 30

  • 1B6

  • 2B4
  • 合計 10

  • 1C 100

  • 2C 200
  • 合計 300

私は次の手順でそれを行うことを考えていました:

  1. 1 つのグループを照会する
  2. 他のクエリでは合計します
  3. Union 演算子を使用して、この結果セットを結合します
  4. すべてのグループに対してステップ 1 ~ 3 を実行し、最後にユニオンを使用してデータのすべてのサブセットを返します。

これを行うより良い方法はありますか?すぐに使用できる機能を使用している可能性がありますか? お知らせ下さい。

編集:

提案とコードサンプルに従って、このコードを試しました:

Select 
Case 
when id is null then 'SUM' 
else CAST(id as Varchar(10)) end as ID,

Case when [group] is null then 'ALL' else CAST([group] as Varchar(50)) end as [group]
,Price from
(
SELECT Id,  [Group],BGAApplicationID,Section, SUM(PrimaryTotalArea) AS price   
FROM vwFacilityDetails
where bgaapplicationid=1102
GROUP BY Id,  [Group],BGAApplicationID,Section  WITH ROLLUP
) a

そして、このコードも:

Select Id,  [Group],BGAApplicationID,Section, SUM(PrimaryTotalArea) AS price           
From   vwFacilityDetails
Where  Not ([group] Is Null And id Is Null And BGAApplicationId is null and section is null) and BGAApplicationId=1102
Group By Id,  [Group],BGAApplicationID,Section 
    With Rollup

結果では、データをグループ化しますが、すべてのレコードについて、次のように (上記の両方のコードで) 3 回表示します。

  • 2879 既存施設 全校 25.00
  • 2879 既存施設 全校 25.00
  • 2879 既存施設 全校 25.00
  • 2879 すべて 25.00

クエリに問題があると思います。こちらもご案内ください。ありがとう

4

3 に答える 3

3
Select
  id,
  [Group],
  SUM(price) AS price
From
  Test
Group By
  [group],
  id 
With
  Rollup

http://sqlfiddle.com/#!3/080cd/8

于 2012-11-01T23:33:34.777 に答える
3

SQL Serverは、使用する必要があるGROUPING SETSを導入しました。

SQL フィドル

MS SQL Server 2008 スキーマのセットアップ:

Create Table vwFacilityDetails (
  id int not null,
  [group] char(1) not null,
  PrimaryTotalArea int not null,
  Section int,
  bgaapplicationid int
);

Insert Into vwFacilityDetails (id, [group], Section,bgaapplicationid,PrimaryTotalArea) values
  (1, 'A', 1,1102,2),
  (1, 'A', 1,1102,1),
  (1, 'A', 1,1102,7),
  (2, 'A', 1,1102,20),
  (1, 'B', 1,1102,6),
  (2, 'B', 1,1102,4),
  (1, 'C', 1,1102,100),
  (2, 'C', 1,1102,200);

クエリ 1 :

SELECT CASE WHEN Id is null then 'SUM'
            ELSE Right(Id,10) end Id,
       [Group],BGAApplicationID,Section,
       SUM(PrimaryTotalArea) price   
FROM vwFacilityDetails
where bgaapplicationid=1102
GROUP BY GROUPING SETS (
  (Id,[Group],BGAApplicationID,Section),
  ([Group])
)
ORDER BY [GROUP],
         ID;

結果

|  ID | GROUP | BGAAPPLICATIONID | SECTION | PRICE |
----------------------------------------------------
|   1 |     A |             1102 |       1 |    10 |
|   2 |     A |             1102 |       1 |    20 |
| SUM |     A |           (null) |  (null) |    30 |
|   1 |     B |             1102 |       1 |     6 |
|   2 |     B |             1102 |       1 |     4 |
| SUM |     B |           (null) |  (null) |    10 |
|   1 |     C |             1102 |       1 |   100 |
|   2 |     C |             1102 |       1 |   200 |
| SUM |     C |           (null) |  (null) |   300 |
于 2012-11-02T02:10:35.407 に答える
1
Select Case when id is null then 'SUM' else CAST(id as Varchar(10)) end as ID
,Case when [group] is null then 'ALL' else CAST([group] as Varchar(10)) end as [group]
,Price from
(
SELECT id, [group], SUM(price) AS Price
FROM IG
GROUP BY [GROUP],ID WITH ROLLUP
) a
于 2012-11-01T23:35:37.743 に答える