使用 CTE 为产品计数单独列
Posted
技术标签:
【中文标题】使用 CTE 为产品计数单独列【英文标题】:Separate columns for product counts using CTEs 【发布时间】:2021-11-11 15:31:40 【问题描述】:由于我的帖子不符合社区规则,再次提出问题。
我首先尝试编写 PIVOT 语句来获得所需的输出。不过,我现在正尝试使用 CTE 来解决这个问题。
这是原始数据。我们就叫它ProductMaster
:
PRODUCT_NUM | CO_CD | PROD_CD | MASTER_ID | Date | ROW_NUM |
---|---|---|---|---|---|
1854 | MAWC | STATIONERY | 10003493039 | 1/1/2021 | 1 |
1567 | PREF | PRINTER | 10003493039 | 2/1/2021 | 2 |
2151 | MAWC | STATIONERY | 10003497290 | 3/2/2021 | 1 |
我需要在单独的列中,Printer_CT,Stationery_Ct 中的这些数据中为每个家庭提供每种产品的计数
每个 Master_ID 代表一个家庭。一个家庭可以拥有多种产品。
所以每个家庭在我的最终输出中代表一行,我需要将产品计数放在不同的列中。每个家庭可以有多个产品,4个甚至更多。但我已经简化了这个例子。
我正在编写一个带有 CTE 的查询,以提供我想要的输出。在我的输出中,每一行都按主 ID 分组
ORGL_CO_CD | ORGL_PROD_CD | STATIONERY_CT | PRINTER_CT |
---|---|---|---|
MAWC | STATIONERY | 1 | 1 |
MAWC | STATIONERY | 1 | 0 |
这是我的问题。我不确定在哪里介绍“Stationery_Ct”列
WITH CTE AS
(
SELECT
CO_CD, Prod_CD, MASTER_ID,
'' as S1_CT, '' as P1_CT
FROM
ProductMaster
WHERE
ROW_NUM = 1
), CTE_2 AS
(
SELECT Prod_CD, MASTER_ID
FROM ProductMaster
WHERE ROW_NUM = 2
)
SELECT
CO_CD AS ORGL_CO_CD,
c.Prod_CD AS ORGL_PROD_CD,
(CASE WHEN c2.Prod_CD = ‘PRINTER’ THEN P1_CT = 1 END) PRINTER_CT
FROM
CTE AS c
LEFT OUTER JOIN
CTE_2 AS c2 ON c.MASTER_ID = c2.MASTER_ID
任何指针将不胜感激。
谢谢!
【问题讨论】:
【参考方案1】:我猜你可以使用GROUP BY
和SUM
来解决这个问题:
-- Test data
DECLARE @ProductMaster AS TABLE (PRODUCT_NUM INT, CO_CD VARCHAR(30), PROD_CD VARCHAR(30), MASTER_ID BIGINT)
INSERT @ProductMaster VALUES (1854, 'MAWC', 'STATIONERY', 10003493039)
INSERT @ProductMaster VALUES (1567, 'PREF', 'PRINTER', 10003493039)
INSERT @ProductMaster VALUES (2151, 'MAWC', 'STATIONERY', 10003497290)
SELECT
MASTER_ID,
SUM(CASE PROD_CD WHEN 'STATIONERY' THEN 1 ELSE 0 END) AS STATIONERY_CT,
SUM(CASE PROD_CD WHEN 'PRINTER' THEN 1 ELSE 0 END) AS PRINTER_CT
FROM @ProductMaster
GROUP BY MASTER_ID
结果是:
MASTER_ID | STATIONERY_CT | PRINTER_CT |
---|---|---|
10003493039 | 1 | 1 |
10003497290 | 1 | 0 |
【讨论】:
以上是关于使用 CTE 为产品计数单独列的主要内容,如果未能解决你的问题,请参考以下文章