Sql server 将MS Access计数和pivot查询转换为SQL Server
我有杂货店数据库。我想数一数每个类别的产品在收据上的数量 表格如下:Sql server 将MS Access计数和pivot查询转换为SQL Server,sql-server,ms-access,count,pivot-table,Sql Server,Ms Access,Count,Pivot Table,我有杂货店数据库。我想数一数每个类别的产品在收据上的数量 表格如下: 交易(id\u交易、数量、id\u收据、id\u产品) 收据(id\u收据、日期、id\u商店、id\u客户) 产品(id\u产品、产品名称、价格、id\u产品类别) 产品类别(id\u产品类别,类别名称) 带有样本数据的所需输出: ID_RECEIPT | desserts | meat | juices | baker products| canned | ---------------------------
(id\u交易、数量、id\u收据、id\u产品)交易
(id\u收据、日期、id\u商店、id\u客户)收据
(id\u产品、产品名称、价格、id\u产品类别)产品
(id\u产品类别,类别名称)产品类别
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()
而不是大小写(以及连接中的括号)。带有Transform
的交叉表查询主要是MS访问类型,而Pivot()
主要是SQL Server函数。但是,下面的代码应该可以跨数据库方言使用
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 ;
本质上,这是经典的转置查询。考虑下面的SQL在大多数RDMS中应该是兼容的。对于MS Access,当
时,您将使用IIF()
而不是大小写(以及连接中的括号)。带有Transform
的交叉表查询主要是MS访问类型,而Pivot()
主要是SQL Server函数。但是,下面的代码应该可以跨数据库方言使用
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 ;
谢谢你,先生,它起作用了,但更重要的是我看到了我做错了什么。谢谢你,先生,它起作用了,但更重要的是我看到了我做错了什么。