2017-12-21 109 views
3

私は次のコードを持っている:PIVOTのSQL - ガイダンス

SELECT * 
    FROM 
     ( 
     SELECT p.ProductID, pc.Name, ISNULL(p.Color, 'Uncolored') AS Color 
     FROM SalesLT.ProductCategory AS pc 
     INNER JOIN SalesLT.Product AS p ON pc.ProductCategoryID = p.ProductCategoryID 
     ) 
    AS PPC 
    PIVOT (COUNT(ProductID) FOR COLOR IN ([Red], [Blue], [Black], [Silver], [Yellow], [Grey], [Multi], [Uncolored])) 
    AS ColorPivotTable 

これはfollwing出力できます:

Results

を、私はこの

に合計列を適用するための最良の方法を知りたいのですが

希望出力 Desired output

事前にフィードバックをいただきありがとうございます。

+1

は「適用合計の列は、」意味することになっているかを説明。 –

+0

こんにちは、すべての商品を色で(「無色の列」の右側に)合計すると、合計32のマウンテンバイクです。また、トールカラムとは、すべての商品を色でまとめた一番下の数字です –

+0

@GordonLinoff私は、ロールアップがOPを満足させるかもしれないと考えていましたが、ここでどうやってこれを行うのかは分かりません。 –

答えて

0

あなたがここに同様の質問を見つけることができます:CUBEを使用して

Using pivot table with column and row totals in sql server 2008

を、溶液はCTE、代替ソリューションを使用して

WITH SalesLT_ProductCategory as (
    SELECT * FROM (
     VALUES 
      (1, 'Mountain Bikes'), 
      (2, 'Road Bikes'), 
      (3, 'Touring Bikes'), 
      (4, 'Brakes') 
      -- etc... 
     ) AS a (ProductCategoryID, Name) 
), SalesLT_Product AS (
    SELECT * FROM (
     VALUES 
      (1, 1, 'Red'), 
      (1, 1, 'Blue'), 
      (1, 1, 'Blue'), 
      (1, 1, 'Blue'), 

      (1, 2, 'Red'), 
      (1, 2, 'Red'), 
      (1, 2, 'Blue'), 
      (1, 2, 'Black'), 

      (1, 3, 'Black'), 
      (1, 3, 'Yellow'), 
      (1, 3, 'Grey'), 
      (1, 3, 'Grey'), 
      (1, 3, 'Grey'), 

      (1, 4, 'Red'), 
      (1, 4, 'Multi'), 
      (1, 4, 'Multi'), 
      (1, 4, 'Uncolored'), 
      (1, 4, 'Uncolored'), 
      (1, 4, 'Uncolored') 
      -- etc... 
     ) AS a (ProductID, ProductCategoryID, Color) 
), BaseData AS (
     SELECT p.ProductID, pc.Name, ISNULL(p.Color, 'Uncolored') AS Color 
     FROM SalesLT_ProductCategory AS pc 
     INNER JOIN SalesLT_Product AS p ON pc.ProductCategoryID = p.ProductCategoryID 
) 
SELECT 
    Name, 
    COALESCE(Red, 0) AS Red, 
    COALESCE(Blue, 0) AS Blue, 
    COALESCE(Black, 0) AS Black, 
    COALESCE(Silver, 0) AS Silver, 
    COALESCE(Yellow, 0) AS Yellow, 
    COALESCE(Grey, 0) AS Grey, 
    COALESCE(Multi, 0) AS Multi, 
    COALESCE(Uncoloured, 0) AS Uncoloured, 
    Total 
FROM (
    SELECT 
    COALESCE(Name, 'Total') AS Name, 
    COALESCE(Color, 'Total') AS Color, 
    COUNT(*) AS Count 
    FROM BaseData 
    GROUP BY CUBE (Name, Color) 
) AS t 
PIVOT (
    SUM(Count) FOR Color IN (
    Red, Blue, Black, Silver, Yellow, 
    Grey, Multi, Uncoloured, Total 
) 
) AS p 
ORDER BY CASE Name WHEN 'Total' THEN 1 ELSE 0 END, Name 

可能性があり

WITH SalesLT_ProductCategory as (
    SELECT * FROM (
     VALUES 
      (1, 'Mountain Bikes'), 
      (2, 'Road Bikes'), 
      (3, 'Touring Bikes'), 
      (4, 'Brakes') 
      -- etc... 
     ) AS a (ProductCategoryID, Name) 
), SalesLT_Product as (
    SELECT * FROM (
     VALUES 
      (1, 1, 'Red'), 
      (1, 1, 'Blue'), 
      (1, 1, 'Blue'), 
      (1, 1, 'Blue'), 

      (1, 2, 'Red'), 
      (1, 2, 'Red'), 
      (1, 2, 'Blue'), 
      (1, 2, 'Black'), 

      (1, 3, 'Black'), 
      (1, 3, 'Yellow'), 
      (1, 3, 'Grey'), 
      (1, 3, 'Grey'), 
      (1, 3, 'Grey'), 

      (1, 4, 'Red'), 
      (1, 4, 'Multi'), 
      (1, 4, 'Multi'), 
      (1, 4, 'Uncolored'), 
      (1, 4, 'Uncolored'), 
      (1, 4, 'Uncolored') 
      -- etc... 
     ) AS a (ProductID, ProductCategoryID, Color) 
), PivotData AS (
    -- your query 
    SELECT * 
    FROM 
     ( 
     SELECT p.ProductID, pc.Name, ISNULL(p.Color, 'Uncolored') AS Color 
     FROM SalesLT_ProductCategory AS pc 
     INNER JOIN SalesLT_Product AS p ON pc.ProductCategoryID = p.ProductCategoryID 
     ) 
    AS PPC 
    PIVOT (COUNT(ProductID) FOR COLOR IN ([Red], [Blue], [Black], [Silver], [Yellow], [Grey], [Multi], [Uncolored])) 
    AS ColorPivotTable 
), ColumnTotals AS (
    -- column totals 
    SELECT 
      'Total' AS Name 
     , SUM(Red) AS Red 
     , SUM(Blue) AS Blue 
     , SUM(Black) AS Black 
     , SUM(Silver) AS Silver 
     , SUM(Yellow) AS Yellow 
     , SUM(Grey) AS Grey 
     , SUM(Multi) AS Multi 
     , SUM(Uncolored)AS Uncolored 
    FROM PivotData 
), PivotDataWithRowTotals AS (
SELECT * FROM PivotData 
UNION ALL 
SELECT * FROM ColumnTotals 
) 
SELECT P.* 
    -- row totals 
    , P.Red + P.Blue + P.Black + P.Silver + P.Yellow + P.Grey + P.Multi + P.Uncolored as Total 
FROM PivotDataWithRowTotals AS P 
+1

マニュアルの 'UNION ALL'連結は、ユースケースに応じて' CUBE'または 'ROLLUP' /' GROUPING SETS'を使用して簡略化することができます。あなたは私がこのブログの投稿に表示したように、より良い計画を立てる可能性が高いです(https://blog.jooq.org/2017/12/22/creating-a-microsoft-excel-style-pivot-table -with-grand-total-in-sql /) –

+0

提案していただきありがとうございます。私は投稿のようにCUBO/ROLLUPを使用する代替ソリューションを投稿しようとします。https://stackoverflow.com/questions/17140559/using-pivot-テーブルと列と行の総計 - SQL Server 2008] – Ezin82

+0

心配する必要はありません。私はすでにそれをやった;-) –

4

可能性がありこれはCUBE() (or GROUPING SETS) calculationという素晴らしい例です。 dはPIVOT representation,I had to write a blog post about itである。

ここでは、あなたが探しているまさに生成ソリューションです:

WITH Bikes(Name, Colour) AS (
    SELECT * FROM (
    VALUES ('Mountain Bikes', 'Black'), 
      ('Mountain Bikes', 'Black'), 
      ('Mountain Bikes', 'Silver'), 
      ('Road Bikes', 'Red'), 
      ('Road Bikes', 'Red'), 
      ('Road Bikes', 'Red'), 
      ('Road Bikes', 'Black'), 
      ('Road Bikes', 'Yellow') 
) AS Bikes(Name, Colour) 
) 
SELECT 
    Name, 
    COALESCE(Red, 0) AS Red, 
    COALESCE(Blue, 0) AS Blue, 
    COALESCE(Black, 0) AS Black, 
    COALESCE(Silver, 0) AS Silver, 
    COALESCE(Yellow, 0) AS Yellow, 
    COALESCE(Grey, 0) AS Grey, 
    COALESCE(Multi, 0) AS Multi, 
    COALESCE(Uncoloured, 0) AS Uncoloured, 
    Total 
FROM (
    SELECT 
    Coalesce(Name, 'Total') Name, 
    COALESCE(Colour, 'Total') Colour, 
    COUNT(*) Count 
    FROM Bikes 
    GROUP BY CUBE (Name, Colour) 
) AS t 
PIVOT (
    MAX(Count) FOR Colour IN (
    Red, Blue, Black, Silver, Yellow, Grey, Multi, Uncoloured, Total 
) 
) AS p 
ORDER BY CASE Name WHEN 'Total' THEN 1 ELSE 0 END, Name 

SQLFiddle here