2

元の質問

新しい質問を開くべきか、それとも最後の質問のマークを外す必要があるのか​​わかりませんでした。だから、私がしたいのは:

WorkWeek  Catg  Item    Cost
WorkWeek1 Cat1  Item1   Price
WorkWeek1 Cat1  Item2   Price
WorkWeek1 Cat2  Item3   Price
WorkWeek1 Cat3  Item4   Price
WorkWeek1 Cat3  Item1   Price
WorkWeek2 Cat1  Item1   Price
WorkWeek2 Cat2  Item2   Price
WorkWeek3 Cat1  Item1   Price
WorkWeek4 Cat1  Item2   Price
.
.
WorkWeekA CatB  ItemC   Price

毎週の就業時間と、その就業週の各catgの価格の合計を一覧表示する新しいテーブルを作成したいと思います。これが私が今やっている方法ですが、クエリは各wwのすべてを合計するだけで、すべての平日で同じ合計が得られます。

select
    workweek
    ,(select sum(cost) from DataTable where Catg = 'Cat1') as Cat1TotalCost
    ,(select sum(cost) from DataTable where Catg = 'Cat2') as Cat2TotalCost
    ,(select sum(cost) from DataTable where Catg = 'Cat3') as Cat3TotalCost
    .
    .
    .
    .
from DataTable
group by Workweek
4

2 に答える 2

3

次のようにピボットを実行することもできます。

select workweek,
       sum(case when Catg = 'Cat1' then cost end) as Cat1TotalCost,
       sum(case when Catg = 'Cat2' then cost end) as Cat2TotalCost,
       sum(case when Catg = 'Cat3' then cost end) as Cat3TotalCost
from DataTable
group by Workweek

値ごとに個別のサブクエリを実行しないでください。

このpivot声明は、非常に合理的な代替案でもあります。列を追加する際の柔軟性が高くなるため、明示的なバージョン(上記)を使用する傾向があります。

于 2013-03-21T13:38:50.233 に答える
2

PIVOT代わりに、テーブル演算子を使用してこれを行うことができます。

SELECT *
FROM
(
  SELECT workweek, catg, cost
  FROM datatable
) AS t
PIVOT
(
  SUM(cost)
  FOR catg IN (Cat1, Cat2, Cat3)
) AS p;

SQLフィドルデモ


値を手動で一覧表示する必要がなく、テーブル内catgののすべての値に対して動的にこれを実行する場合は、catg動的SQLを使用して動的にこれを実行できます。何かのようなもの:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(catg)
                      FROM datatable                      
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

SELECT @query = 
    'SELECT 
      *
    FROM 
    (
      SELECT workweek, catg, cost
      FROM datatable
    ) AS t
    PIVOT
    (
      SUM(cost)
      FOR catg IN ( ' + @cols + ')
    ) AS p';



EXECUTE( @query);

更新されたSQLフィドルデモ

于 2013-03-21T12:53:53.197 に答える