Sql server 销售产品的计数和分组

Sql server 销售产品的计数和分组,sql-server,sql-server-2008,tsql,sql-server-2005,Sql Server,Sql Server 2008,Tsql,Sql Server 2005,我有一个表事务&表产品,如下所示。 每笔交易都有多个产品 ProductId Name 1 ABC 2 DEF 3 GHI 每笔交易可以销售多个产品 TransactionId ProductSoldInDept1 ProductSoldinDept2 ProductSoldinDept3 1 1 null null

我有一个表事务&表产品,如下所示。 每笔交易都有多个产品

  ProductId Name
      1      ABC
      2      DEF
      3      GHI
每笔交易可以销售多个产品

TransactionId ProductSoldInDept1 ProductSoldinDept2 ProductSoldinDept3
        1         1                       null         null
        2         1                        2           null
        3         3                        1           null
        4         2                        3             1  
我计划生成一份报告,我希望得到如下结果:

这显示了按Id分组的每个部门销售的产品数量

预期结果:

我可以一直到这里,这是一个查询,以获得一个特定产品的计数 哪个是productid:1 我想知道如何在这里使用组:

select Count(CASE WHEN ProductSoldInDept1 = 1 THEN 1 END) ,
    Count(CASE WHEN ProductSoldInDept2 = 1 THEN 1 END) ,
      Count(CASE WHEN ProductSoldInDept3 = 1 THEN 1 END)
from   Table1 
试试这个

select ProductID, 
v.Department1ProdCount, v.Department2ProdCount, v.Department3ProdCount
from product a
cross apply 
(
 select Count(CASE WHEN ProductSoldInDept1 = a.ProductID THEN 1 END) Department1ProdCount,
 Count(CASE WHEN ProductSoldInDept2 = a.ProductID THEN 1 END) Department2ProdCount,
 Count(CASE WHEN ProductSoldInDept3 = a.ProductID THEN 1 END) Department3ProdCount
 from  Table1
) v
试试这个

select ProductID, 
v.Department1ProdCount, v.Department2ProdCount, v.Department3ProdCount
from product a
cross apply 
(
 select Count(CASE WHEN ProductSoldInDept1 = a.ProductID THEN 1 END) Department1ProdCount,
 Count(CASE WHEN ProductSoldInDept2 = a.ProductID THEN 1 END) Department2ProdCount,
 Count(CASE WHEN ProductSoldInDept3 = a.ProductID THEN 1 END) Department3ProdCount
 from  Table1
) v
结果

结果

这:

可能更好的结构如下:

transid   prodsold    deptid
1         1           1
2         1           1
2         2           2
3         3           1
3         1           2
4         2           1
4         3           2
4         1           3
我认为这将使您的查询更容易编写。

这:

  TransactionId ProductSoldInDept1 ProductSoldinDept2 ProductSoldinDept3
    1         1                       null         null
    2         1                        2           null
    3         3                        1           null
    4         2                        3             1  
可能更好的结构如下:

transid   prodsold    deptid
1         1           1
2         1           1
2         2           2
3         3           1
3         1           2
4         2           1
4         3           2
4         1           3

我认为这会使您的查询更容易编写。

为什么要将每个部门的销售额存储在列中而不是行中?每次添加新部门时,都必须更改所有架构和代码?我原以为我理解您的需求,但您上次的查询让我困惑。您能发布预期结果吗?很抱歉,查询中有错误。我做了一些改变。这样可以吗?你真的只在这些列中存储产品id吗?你在哪里记录人们购买的每种产品的数量?为什么你要将每个部门的销售额存储在列而不是行中?每次添加新部门时,都必须更改所有架构和代码?我原以为我理解您的需求,但您上次的查询让我困惑。您能发布预期结果吗?很抱歉,查询中有错误。我做了一些改变。这样可以吗?你真的只在这些列中存储产品id吗?你在哪里记录有人购买的每种产品的数量?我在没有演示的情况下做了类似的评论,但这并不能真正回答问题,特别是如果他们不能改变模式的话。@Aaron Bertrand-我知道,我也同意。我根据你的评论把这些数据放在这里。我想我认为建议一种可能更好的做事方式至少和直接回答如何用错误的方式做事一样有价值。如果我错了,我会被否决而死。我在没有演示的情况下做了类似的评论,但这并不能真正回答问题,特别是如果他们不能改变模式的话。@Aaron Bertrand-我知道,我也同意。我根据你的评论把这些数据放在这里。我想我认为建议一种可能更好的做事方式至少和直接回答如何用错误的方式做事一样有价值。如果我错了,我会被投到死刑上。场上+1=计数。。。希望你不介意编辑。谢谢亚伦!很好用!我也读了你的评论。我在问题中的表格集实际上是虚构的,但我在工作中遇到了类似的问题。所以我刚刚创建了一个场景。谢谢你的建议、答案和编辑:-+1表示字段=计数。。。希望你不介意编辑。谢谢亚伦!很好用!我也读了你的评论。我在问题中的表格集实际上是虚构的,但我在工作中遇到了类似的问题。因此,我刚刚创建了一个场景。感谢您的建议、答案和编辑:-
transid   prodsold    deptid
1         1           1
2         1           1
2         2           2
3         3           1
3         1           2
4         2           1
4         3           2
4         1           3