Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy vấn SQL để hiển thị bán sản phẩm

Bạn có thể tổng hợp dữ liệu bằng cách sử dụng câu lệnh SUM và CASE.

Sử dụng định nghĩa bảng của bạn (và một số dữ liệu được tạo thành rất tối thiểu), đây là ví dụ về cách bạn có thể làm điều đó:

--** 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
;   

Truy vấn sử dụng hàm DENSE_RANK để nhóm các mục có kích thước lại với nhau và sắp xếp chúng theo thứ tự kích thước bổ sung và điều này được sử dụng để tìm ra dữ liệu sẽ được ghi vào cột nào.

Mặc dù có một toán tử PIVOT trong SQL Server 2005 trở lên, nó không hữu ích lắm khi bạn có các loại tiêu đề cột khác nhau (kích thước và số lượng mục trong trường hợp này).

Bạn sẽ phải quyết định số lượng kích thước sản phẩm tối đa mà bạn muốn báo cáo vì điều này được mã hóa cố định trong truy vấn. Vì vậy, nếu số kích thước sản phẩm tối đa là 3 thì bạn viết mã truy vấn như hình trên. Tuy nhiên, nếu một trong các sản phẩm của bạn có 4 kích thước khác nhau, thì bạn sẽ thêm một cặp cột bổ sung Kích thước mặt hàng và Số lượng cho t.Col =4, v.v.

Tôi hy vọng điều này sẽ hữu ích.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tắt CDC trên tập hợp bảng HOẶC tắt trên tất cả bảng trong cơ sở dữ liệu trong SQL Server - Hướng dẫn sử dụng SQL Server

  2. làm thế nào để thay đổi mức độ cô lập?

  3. Nhóm và tổng hợp dữ liệu hàng thành cột trong MS-SQL?

  4. Chức năng Table-Valued - Thứ tự theo bị bỏ qua trong đầu ra

  5. Cách thay đổi các phần chèn tham số chậm thành bản sao hàng loạt nhanh (ngay cả từ bộ nhớ)