0

我有一个数据透视查询,它返回每个客户在每个类别中花费了多少,返回以下结果:

transaction_id  1       2       3       4       5       6       7
10-52927        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52928        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52929        8       NULL    NULL    NULL    NULL    149     NULL
10-52930        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52931        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52932        NULL    NULL    12      NULL    NULL    NULL    NULL
10-52934        NULL    NULL    NULL    NULL    NULL    NULL    NULL
10-52935        NULL    NULL    NULL    NULL    NULL    33      NULL
10-52936        NULL    NULL    NULL    NULL    NULL    NULL    NULL

Pivot 基于多行聚合从产品级别到类别的销售额,这意味着每个 transaction_id 记录通常使用 sum() 作为枢轴参数从 20 多行聚合。

我想要实现的是获得 0-1 格式的结果,表明客户是否购买了类别 1、2、3、4、5 的任何东西...... ~400 无需创建额外的表格,因为必须重复操作 100 + 商店。

有什么建议如何在不创建额外表来存储和更新结果的情况下执行此任务?

提前致谢。

编辑:

查询产品呈现的输出如下:

select transaction_id, [1], [2], [3], // up to ~400 numerical categories
from (SELECT  [transaction_id]
             ,[category]
             ,sum([SUM]) as SUM_2
      FROM [XXX].[dbo].[receipts]
      left join // join of recept table with category table
      where // store type related parametrs
      group by transaction_id, category) p 
PIVOT (sum([sum_2]) for [category] in
       ([1], [2], [3], [4], ... ) // shortened list of categories in order to improve code readability
      ) as pvt 
ORDER BY pvt.transaction_id

类别

4

3 回答 3

0

好的,您可以在不更改 cte(FROM 部分)的情况下执行此操作。

在 SELECT 和 FROM 之间添加

INTO #MyTempTable

更安全的是事先创建它,检查它是否已经存在,并从现有的 SELECT 中插入。

然后你可以这样做:

SELECT transaction_id, CASE WHEN [1] IS NULL THEN 0 ELSE 1 END [1], 
-- repeat each case
FROM #MyTempTable

如果您可以更改您的 CTE,请删除 group by 和聚合 [SUM_v2],并始终为其赋值 1。在 PIVOT 中将 SUM 更改为 MIN

然后可以以更简单的方式检查表中的列:ISNULL([1], 0) [1]

于 2013-06-24T12:37:17.840 回答
0

这实际上是一个非常有趣的问题。这是第二种解决方案,我得到组的叉积并传播列 ID,以便始终有一个值。我可以想象这种方法会带来性能损失。

我使用@Mark Ba​​nnister 使用 SIGN 在 0/1 列中生成 1。

;WITH P AS
(
   SELECT 
      IDS.transaction_id, IDS.category, CAST(ISNULL(SIGN(C.Sum), 0) AS INT) [hassum]
   FROM 
      (SELECT DISTINCT
      A.transaction_id, B.category
      FROM Reciepts [A] CROSS JOIN Categories [B]) AS IDS
      LEFT JOIN Transaction AS T ON T.transaction_id = IDS.transaction_ID
      LEFT JOIN Category AS C ON -- some unspecified join ...
          AND C.Category = IDS.Category
)
SELECT transaction_id, [1], [2], [3]
FROM P
PIVOT (MIN(hassum) FOR category IN ([1], [2], [3]) ) AS [hassum]
于 2013-06-24T13:16:01.177 回答
0

如果您可以对源表进行分组,以便有 0 或 1 个匹配行,那么使用 COUNT(Category) 应该可以工作。(它适用于我类似但略有不同的场景)

于 2018-05-29T11:14:14.157 回答