将 MS 访问计数和数据透视查询转换为 SQL 服务器
Convert MS Access count and pivot query into SQL Server
我有杂货店数据库。我想计算收据上每个类别的产品数量。
表格是:
Transactions
(id_transaction,数量,id_receipt,id_product)
Receipts
(id_receipt, 日期, id_store, id_customer)
Products
(id_product, product_name, 价格, id_prod_cat)
Product_Categories
(id_prod_cat, category_name)
带有示例数据的所需输出:
ID_RECEIPT | desserts | meat | juices | baker products| canned |
-------------------------------------------------------------------|
1 | 0 | 2 | 1 | 3 | 0 |
2 | 1 | 0 | 3 | 1 | 0 |
--------------------------------------------------------------------
我试过这个查询但没有成功。
TRANSFORM Nz(Count(dbo.Transactions.quantity), 0) AS Product Count
SELECT dbo.Receipts.id_receipt
FROM dbo.Product_Categories
INNER JOIN (dbo.Receipts
INNER JOIN (dbo.PRODUCTS
INNER JOIN dbo.TRANSACTIONS ON dbo.PRODUCTS.id_product = dbo.TRANSACTIONS.id_product)
ON dbo.RECEIPTS.id_receipt = dbo.TRANSACTIONS.id_receipt)
ON dbo.Product_Categories.id_prod_cut = dbo.Products.id_product
GROUP BY
dbo.Receipts.id_receipt
PIVOT
dbo.Product_Categories.category_name
本质上,这是经典的转置查询。考虑以下 SQL,它应该符合大多数 RDMS。对于 MS Access,您将使用 IIF()
而不是 CASE WHEN
(以及连接中的括号)。 Transform
的交叉表查询主要是 MS Access 类型,而 Pivot()
主要是 SQL 服务器功能。但是,下面应该跨数据库方言工作。
SELECT
dbo.Receipts.id_receipt,
Count(CASE WHEN dbo.Product_Categories.category_name='desserts'
THEN dbo.Transactions.quantity END) As [desserts],
Count(CASE WHEN dbo.Product_Categories.category_name='meat'
THEN dbo.Transactions.quantity END) As [meat],
Count(CASE WHEN dbo.Product_Categories.category_name='juices'
THEN dbo.Transactions.quantity END) As [juices],
Count(CASE WHEN dbo.Product_Categories.category_name='baker products'
THEN dbo.Transactions.quantity END) As [baker products],
Count(CASE WHEN dbo.Product_Categories.category_name='canned'
THEN dbo.Transactions.quantity END) As [canned]
FROM dbo.Product_Categories
INNER JOIN dbo.Receipts
INNER JOIN dbo.PRODUCTS
INNER JOIN dbo.TRANSACTIONS ON dbo.PRODUCTS.id_product = dbo.TRANSACTIONS.id_product
ON dbo.RECEIPTS.id_receipt = dbo.TRANSACTIONS.id_receipt
ON dbo.Product_Categories.id_prod_cut = dbo.Products.id_product
GROUP BY dbo.Receipts.id_receipt ;
我有杂货店数据库。我想计算收据上每个类别的产品数量。
表格是:
Transactions
(id_transaction,数量,id_receipt,id_product)Receipts
(id_receipt, 日期, id_store, id_customer)Products
(id_product, product_name, 价格, id_prod_cat)Product_Categories
(id_prod_cat, category_name)
带有示例数据的所需输出:
ID_RECEIPT | desserts | meat | juices | baker products| canned |
-------------------------------------------------------------------|
1 | 0 | 2 | 1 | 3 | 0 |
2 | 1 | 0 | 3 | 1 | 0 |
--------------------------------------------------------------------
我试过这个查询但没有成功。
TRANSFORM Nz(Count(dbo.Transactions.quantity), 0) AS Product Count
SELECT dbo.Receipts.id_receipt
FROM dbo.Product_Categories
INNER JOIN (dbo.Receipts
INNER JOIN (dbo.PRODUCTS
INNER JOIN dbo.TRANSACTIONS ON dbo.PRODUCTS.id_product = dbo.TRANSACTIONS.id_product)
ON dbo.RECEIPTS.id_receipt = dbo.TRANSACTIONS.id_receipt)
ON dbo.Product_Categories.id_prod_cut = dbo.Products.id_product
GROUP BY
dbo.Receipts.id_receipt
PIVOT
dbo.Product_Categories.category_name
本质上,这是经典的转置查询。考虑以下 SQL,它应该符合大多数 RDMS。对于 MS Access,您将使用 IIF()
而不是 CASE WHEN
(以及连接中的括号)。 Transform
的交叉表查询主要是 MS Access 类型,而 Pivot()
主要是 SQL 服务器功能。但是,下面应该跨数据库方言工作。
SELECT
dbo.Receipts.id_receipt,
Count(CASE WHEN dbo.Product_Categories.category_name='desserts'
THEN dbo.Transactions.quantity END) As [desserts],
Count(CASE WHEN dbo.Product_Categories.category_name='meat'
THEN dbo.Transactions.quantity END) As [meat],
Count(CASE WHEN dbo.Product_Categories.category_name='juices'
THEN dbo.Transactions.quantity END) As [juices],
Count(CASE WHEN dbo.Product_Categories.category_name='baker products'
THEN dbo.Transactions.quantity END) As [baker products],
Count(CASE WHEN dbo.Product_Categories.category_name='canned'
THEN dbo.Transactions.quantity END) As [canned]
FROM dbo.Product_Categories
INNER JOIN dbo.Receipts
INNER JOIN dbo.PRODUCTS
INNER JOIN dbo.TRANSACTIONS ON dbo.PRODUCTS.id_product = dbo.TRANSACTIONS.id_product
ON dbo.RECEIPTS.id_receipt = dbo.TRANSACTIONS.id_receipt
ON dbo.Product_Categories.id_prod_cut = dbo.Products.id_product
GROUP BY dbo.Receipts.id_receipt ;