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 ;

谢谢你,先生,它起作用了,但更重要的是我看到了我做错了什么。谢谢你,先生,它起作用了,但更重要的是我看到了我做错了什么。