SQL 产品矩阵

标签 sql sql-server t-sql matrix

假设我销售 T 恤,并且有一个表格,用于提取销售的颜色和数量以及客户,并且我想创建一个在 x 轴和 y 轴上包含 100 种颜色的矩阵,这样我就可以确定 T 恤的颜色客户在第一个订单上购买的商品以及他们在第二个订单上回来购买的颜色。

如何在不写出 1000 个 case when 语句的情况下创建矩阵?

首次购买表

|Customer|Color|PurchaseQty|
----------------------------
|   1    |Blue |     2     |
|   2    |Red  |     1     |
|   3    |White|     2     |
---------------------------

第二个购买表

|Customer|Color|PurchaseQty|
----------------------------
|   1    |Red  |     1     |
|   2    |White|     3     |
|   3    |Blue |     1     |
---------------------------
       Red        White        Blue
--------------------------------------
Red  |              1
--------------------------------------
White|                           1
--------------------------------------
Blue |  1
--------------------------------------

Sample

最佳答案

动态枢轴的示例有很多,但这里有一个可以处理您的 X/Y 矩阵

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Color) From #Second  Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = '
Select [YAxis] as [Color],' + @SQL + '
From (
        Select YAxis = A.Color
              ,XAxis = B.Color
              ,Value = 1
         From  #First A
         Join  #Second B on (A.Customer=B.Customer)
     ) A
 Pivot (max(Value) For [XAxis] in (' + @SQL + ') ) p'
Exec(@SQL);

返回

Color   Blue    Red     White
Blue    NULL    1       NULL
Red     NULL    NULL    1
White   1       NULL    NULL

关于SQL 产品矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43213803/

相关文章:

c# - 通配符搜索 LINQ

mysql - 如何在 Windows 中每 60 秒终止一次 MySQL 查询或休眠连接?

php - MYSQL:如何从列中选择最高出现次数?

sql-server - CTE 到底如何发挥作用?

linq-to-sql - 根据相关数据库列验证字符串长度

sql - 在存储过程中为同一变量传递多个值

SQL 列在 ORDER BY 中无效,未包含在聚合或 GROUP BY 中

mysql - MariaDB 10.1 中 DELETE 语法错误的未知原因

sql - 表规范化(将逗号分隔的字段解析为单独的记录)

sql - 增量 SQL 查询