Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Permintaan SQL untuk menampilkan penjualan produk

Anda dapat menggabungkan data menggunakan pernyataan SUM dan CASE.

Menggunakan definisi tabel Anda (dan beberapa data yang dibuat sangat minim), berikut adalah contoh bagaimana Anda dapat melakukannya:

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

Kueri menggunakan fungsi DENSE_RANK untuk mengelompokkan item dengan ukuran tertentu dan mengurutkannya dalam urutan ukuran dan ini digunakan untuk menentukan kolom mana data harus ditulis.

Meskipun ada operator PIVOT di SQL Server 2005 dan yang lebih baru, itu tidak terlalu membantu bila Anda memiliki jenis judul kolom yang berbeda (dalam hal ini ukuran dan kuantitas item).

Anda harus memutuskan jumlah maksimum ukuran produk yang ingin Anda laporkan karena ini dikodekan ke dalam kueri. Jadi jika jumlah maksimum ukuran produk adalah 3 maka Anda mengkodekan kueri seperti yang ditunjukkan di atas. Namun, jika salah satu produk Anda memiliki 4 ukuran berbeda, maka Anda akan menambahkan pasangan kolom Ukuran Barang dan Kuantitas tambahan untuk t.Col =4 dan seterusnya.

Saya harap ini membantu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbedaan antara numerik, float dan desimal di SQL Server

  2. Cara Mengonversi String ke Tanggal/Waktu di SQL Server menggunakan CONVERT()

  3. SQL Pilih nilai di dalam tanda kurung

  4. Bagaimana cara mengekspor XML menggunakan kueri SQL Server?

  5. Beberapa Pernyataan Pilihan menggunakan SQL Server 2005 DENGAN Pernyataan