【问题标题】:How to transpose rows into columns and it will become only one row?如何将行转置为列,它将变成只有一行?
【发布时间】:2021-08-20 08:51:44
【问题描述】:

我有这个问题:

SELECT DISTINCT 
    MAX(D.RECEIVEDDATE) AS DATE,
    A.LOCATIONNUMBER AS ID_NAME,
    (SELECT CARRIERNUMBER FROM CARRIER C WHERE C.CARRIERID = D.CARRIERID) AS CR_NAME,
    D.DEPOSITREFERENCE As ITEM_REF,
    DC.CONTAINERNUMBER As ITEM_NUM,
    Z.DENOMINATION As Category,
    D.RECEIVEDCONTAINERS as ITEM_QTY,
    SUM(CASE WHEN Z.DENOMINATION LIKE '%50%' THEN CAST(Z.VERIFIEDQUANTITY AS BIGINT) END) QTY_50_PCS,
    SUM(CASE WHEN Z.DENOMINATION LIKE '%100%' THEN CAST(Z.VERIFIEDQUANTITY AS BIGINT) END) QTY_100_PCS,
    SUM(CASE WHEN Z.DENOMINATION LIKE '%50%' THEN CAST(Z.VERIFIEDAMOUNT AS BIGINT) END) AMT_50_PCS,
    SUM(CASE WHEN Z.DENOMINATION LIKE '%100%' THEN CAST(Z.VERIFIEDAMOUNT AS BIGINT) END) AMT_100_PCS,
    CAST(D.VERIFIEDAMOUNT AS BIGINT) AS TOTAL_AMT
FROM
    DEPOSIT D
JOIN 
    ACCOUNT A ON D.ACCOUNTID = A.ACCOUNTID 
LEFT JOIN  
    DEPOSITCONTAINER DC ON DC.DEPOSITID = D.DEPOSITID
LEFT JOIN 
    DEPOSITCONTAINERITEM Z ON Z.DEPOSITCONTAINERID = DC.DEPOSITCONTAINERID
LEFT JOIN 
    DEPOSITCONTAINERITEMUNIT X ON X.DEPOSITCONTAINERITEMID = Z.DEPOSITCONTAINERITEMID
WHERE 
    D.DEPOSITTYPE = 0 
    AND LOCATIONNUMBER LIKE 'Z%' 
    AND D.RECEIVEDDATE IS NOT NULL 
    AND Z.DENOMINATION IS NOT NULL 
GROUP BY 
    D.RECEIVEDDATE, A.LOCATIONNUMBER, D.CARRIERID, D.DEPOSITREFERENCE,
    D.RECEIVEDCONTAINERS, D.VERIFIEDAMOUNT, DC.CONTAINERNUMBER, DC.VERIFIEDAMOUNT, Z.DENOMINATION 
ORDER BY  
    D.DEPOSITREFERENCE 

输出/结果会变成这样:

DATE ID_NAME CR_NAME ITEM_REF ITEM_NUM CATEGORY ITEM_QTY QTY_50_PCS QTY_100_PCS AMT_50_PCS AMT_100_PCS TOTAL_AMT
2021-07-26 XXN8A ABC 0039546898202ZZN8A N5-050-210001 50000 6 2000 NULL 100000000 NULL 672600000
2021-07-26 XXN8A ABC 0039546898202ZZN8A N5-050-210002 50000 6 2095 NULL 104750000 NULL 672600000
2021-07-26 XXN8A ABC 0039546898202ZZN8A N5-100-2100002 100000 6 NULL 2120 NULL 212000000 672600000
2021-07-26 XXN8A ABC 0039546898202ZZN8A N5-100-210001 100000 6 NULL 2069 NULL 206900000 672600000
2021-07-26 XXN8A ABC 0039546898202ZZN8A N5-RJC-210001 100000 6 NULL 383 NULL 38300000 672600000
2021-07-26 XXN8A ABC 0039546898202ZZN8A N5-RJC-210001 50000 6 213 NULL 10650000 NULL 672600000
2021-07-27 CCY57 CAB 0344416011204ZZY57 G6-50-210153 50000 6 68 NULL 3400000 NULL 140050000
2021-07-27 CCY57 CAB 0344416011204ZZY57 G6-50-210154 50000 6 75 NULL 3750000 NULL 140050000
2021-07-27 CCY57 CAB 0344416011204ZZY57 G6-RJC-210153 100000 6 NULL 486 NULL 48600000 140050000
2021-07-27 CCY57 CAB 0344416011204ZZY57 G6-RJC-210153 50000 6 26 NULL 1300000 NULL 140050000

如何根据ITEM_NUM获取只有一行和列的转置表?例如,第一项 N5-050-210001 价值数量 2000 将在 QTY_50 列中,那么如果有第二项 N5-050-210002 的值为 2095,它将被放置在第二列 QTY_50_2 中。这也适用于像'%-100-%'和'%-RJC%'这样的ITEM_NUM,ITEM_NUM和Category列将被消除,我想要的结果是这样的:

DATE ID_NAME CR_NAME ITEM_REF ITEM_QTY QTY_50 QTY_50_2 QTC_RJC_50 QTY_100 QTY_100_2 QTC_RJC_100 AMT_50_PCS AMT_100_PCS TOTAL_AMT
7/26/2021 XXN8A ABC 0039546898202ZZN8A 6 2000 2095 213 2069 2120 383 215400000 457200000 672600000
7/27/2021 CCY57 CAB 0344416011204ZZY57 6 68 75 26 773 57 486 8450000 131600000 140050000

有什么建议吗?

【问题讨论】:

  • 请只标记您真正使用的RDBMS。谢谢。
  • SELECT DISTINCT 在您执行GROUP BY 时(很少)不需要,因为GROUP BY 不会返回重复的行。
  • 旁注:使用DISTINCTGROUP BY 几乎总是存在缺陷的迹象; GROUP BY 已经强制您的数据在 distinct 组中返回。这通常意味着您的GROUP BY 是错误的(我可能会建议这是错误的,因为您的GROUP BY 中的列比SELECT 中的未聚合列多)。也许如果你修复你的GROUP BY(并删除DISTINCT,因为它只是不必要的开销)问题就会消失?
  • 轻松为您提供帮助 - 简化! minimal reproducible example
  • LEFT JOIN Z 结合where z.column is not null,意味着你实际上想要一个普通的INNER JOIN

标签: sql pivot-table transpose


【解决方案1】:

如果您想要的结果集对于 DATEID_NAMECR_NAMEITEM_REF 的每个组合都有一行,那么这些应该是 GROUP BY 中的唯一列。但是,DATE 确实是一个聚合表达式,所以你只想要其他三个。

所以:

SELECT MAX(RECEIVEDDATE) as DATE, ID_NAME, CR_NAME, ITEM_REF,
       SUM(CASE WHEN Z.DENOMINATION LIKE '%50%' THEN CAST(Z.VERIFIEDQUANTITY AS BIGINT) END) as QTY_50_PCS,
       .  .
FROM . . .
GROUP BY ID_NAME, CR_NAME, ITEM_REF;

【讨论】:

  • 感谢您的回答,但我的问题实际上是如何区分具有几乎相似值的 ITEM_NUM 列中的值,例如:'N5-050-210001' 和 'N5-050-2100002'所以我可以把它们放到不同的列中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多