sql >> データベース >  >> RDS >> Sqlserver

商品の売上を表示するSQLクエリ

    SUM および CASE ステートメントを使用してデータを集計できます。

    テーブル定義 (およびいくつかの非常に最小限の構成データ) を使用して、それを行う方法の例を次に示します。

    --** Create test tables
    DECLARE @SalesLog TABLE ( 
    SalesID int IDENTITY(1,1) NOT NULL, 
    MemoNo int NULL, 
    ProductCode int NULL, 
    Quantity int NULL, 
    Price int NULL, 
    ProductGroup int NULL)
    
    DECLARE @Products TABLE( 
    ProductId int IDENTITY(1,1) NOT NULL, 
    pName nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    pSize int NULL, 
    pPrice int NULL, 
    pPackQty int NULL, 
    pGroup int NULL, 
    pCode int NULL, 
    pStock int NULL, 
    pYrStock int NULL, 
    pClearStock int NULL)
    
    --** Setup test data
    INSERT INTO @SalesLog ( MemoNo, ProductCode, Quantity, Price, ProductGroup)
    SELECT   0, 1, 500, 0, 1 UNION
    SELECT   0, 2, 700, 0, 1 UNION   
    SELECT   0, 2, 333, 0, 1 UNION   
    SELECT   0, 3, 200, 0, 2 UNION
    SELECT   0, 4, 125, 0, 2 ;
    
    INSERT INTO @Products (pName, pSize, pPrice, pPackQty, pGroup, pCode, pStock, pYrStock, pClearStock)
    SELECT 'Beer', 350, 1 , 1, 1, 1, 0, 0, 0 UNION
    SELECT 'Beer', 650, 1 , 1, 1, 2, 0, 0, 0 UNION
    SELECT 'Beer', 1000, 1 , 1, 1, 3, 0, 0, 0 UNION
    SELECT 'Wine', 750, 1 , 1, 2, 4, 0, 0, 0 UNION 
    SELECT 'Wine', 1000, 1 , 1, 2, 5, 0, 0, 0 ;
    
    --** Example query
    SELECT t.pName AS 'Product'
         , MAX(CASE WHEN t.Col = 1 THEN t.pSize END) AS 'Item Size'
         , ISNULL(SUM(CASE WHEN t.Col = 1 THEN t.Quantity END),0) AS 'Quantity'
         , MAX(CASE WHEN t.Col = 2 THEN t.pSize END) AS 'Item Size'
         , ISNULL(SUM(CASE WHEN t.Col = 2 THEN t.Quantity END),0) AS 'Quantity'
         , MAX(CASE WHEN t.Col = 3 THEN t.pSize END) AS 'Item Size'
         , ISNULL(SUM(CASE WHEN t.Col = 3 THEN t.Quantity END),0) AS 'Quantity'
    FROM (
    SELECT pName
         , pCode
         , pGroup
         , pSize
         , sl.Quantity
         , DENSE_RANK() OVER(PARTITION BY p.pGroup ORDER BY p.pSize) AS Col
      FROM @Products AS p
      LEFT JOIN @SalesLog AS sl
        ON p.pGroup = sl.ProductGroup
       AND p.pCode = sl.ProductCode
         ) AS t
     GROUP BY t.pGroup
         , t.pName
    ;   
    

    クエリは、DENSE_RANK 関数を使用して、サイズのアイテムをグループ化し、サイズの昇順に並べ替えます。これは、データを書き込む列を決定するために使用されます。

    SQL Server 2005 以降には PIVOT 演算子がありますが、列見出しの種類 (この場合は項目のサイズと数量) が異なる場合はあまり役に立ちません。

    これはクエリにハードコードされているため、レポートする製品サイズの最大数を決定する必要があります。したがって、製品サイズの最大数が 3 の場合、上記のようにクエリをコーディングします。ただし、商品の 1 つに 4 つの異なるサイズがある場合は、t.Col =4 などの項目のサイズと数量の列のペアを追加します。

    これがお役に立てば幸いです。



    1. 配列をmysqlデータベース列に挿入する

    2. 文字列を区切り文字として使用して、正規表現を使用して文字列を分割するにはどうすればよいですか?

    3. 自動インクリメントの開始番号を変更しますか?

    4. PL / SQLでは、テーブルをパラメータとして取得し、フィルタリングして返します。