【问题标题】:Is it possible to Pivot this query?是否可以透视此查询?
【发布时间】:2018-12-17 20:50:47
【问题描述】:

我的查询

SELECT DISTINCT dbo.tblacc_cv.cv_docno, 
                dbo.tblacc_cv.cv_docdate, 
                dbo.tblacc_cv.cv_suppliername, 
                dbo.tblacc_cv.cv_extdocno, 
                dbo.tblacc_chartaccount.coa_cvtype AS cvtype, 
                dbo.tblacc_glentry.gl_accountid, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid = '201001' THEN Sum( 
                    dbo.tblacc_glentry.gl_credit) 
                    ELSE NULL 
                  END )                            AS AP, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid = '208000' THEN Sum( 
                    dbo.tblacc_glentry.gl_amount) 
                    ELSE NULL 
                  END )                            AS EWT, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid = '616000' 
                         AND dbo.tblacc_chartaccount.coa_cvtype = 'S' THEN Sum( 
                    dbo.tblacc_glentry.gl_debit) 
                    ELSE NULL 
                  END )                            AS FABpur, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid = '603000' 
                         AND dbo.tblacc_chartaccount.coa_cvtype = 'S' THEN Sum( 
                    dbo.tblacc_glentry.gl_debit) 
                    ELSE NULL 
                  END )                            AS FABcre, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid = '602000' 
                         AND dbo.tblacc_chartaccount.coa_cvtype = 'S' THEN Sum( 
                    dbo.tblacc_glentry.gl_debit) 
                    ELSE NULL 
                  END )                            AS RawMat, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid = '601003' 
                         AND dbo.tblacc_chartaccount.coa_cvtype = 'S' THEN Sum( 
                    dbo.tblacc_glentry.gl_debit) 
                    ELSE NULL 
                  END )                            AS PurCre, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid NOT IN ( 
                         '201001', '208000', '616000', '603000', 
                         '602000', '601003' ) THEN 
                    dbo.tblacc_glentry.gl_accountname 
                    ELSE NULL 
                  END )                            AS GL_AccountName, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid NOT IN ( 
                         '616000', '603000', '602000', '601003' 
                              ) 
                         AND dbo.tblacc_chartaccount.coa_cvtype = 'M' THEN Sum( 
                    dbo.tblacc_glentry.gl_debit) 
                    ELSE NULL 
                  END )                            AS MOdr, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid NOT IN ( 
                         '616000', '603000', '602000', '601003' 
                              ) 
                         AND dbo.tblacc_chartaccount.coa_cvtype = 'F' THEN Sum( 
                    dbo.tblacc_glentry.gl_debit) 
                    ELSE NULL 
                  END )                            AS FDR, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid NOT IN ( 
                         '201001', '208000', '616000', '603000', 
                         '602000', '601003' ) 
                         AND dbo.tblacc_chartaccount.coa_cvtype = 'S' THEN Sum( 
                    dbo.tblacc_glentry.gl_debit) 
                    ELSE NULL 
                  END )                            AS SunDR, 
                ( CASE 
                    WHEN dbo.tblacc_glentry.gl_accountid NOT IN ( 
                         '201001', '208000', '616000', '603000', 
                         '602000', '601003' ) 
                         AND dbo.tblacc_chartaccount.coa_cvtype = 'S' THEN Sum( 
                    dbo.tblacc_glentry.gl_credit) 
                    ELSE NULL 
                  END )                            AS SunCR 
FROM   dbo.tblacc_glentry 
       INNER JOIN dbo.tblacc_apv 
               ON dbo.tblacc_glentry.gl_docno = dbo.tblacc_apv.apv_docno 
       INNER JOIN dbo.tblacc_cv 
                  INNER JOIN dbo.tblacc_cvdetail 
                          ON dbo.tblacc_cv.cv_docno = 
                             dbo.tblacc_cvdetail.cvd_cv_docno 
               ON dbo.tblacc_apv.apv_docno = dbo.tblacc_cvdetail.cvd_refdocno 
       INNER JOIN dbo.tblacc_chartaccount 
               ON dbo.tblacc_glentry.gl_accountid = 
                  dbo.tblacc_chartaccount.coa_account_id 
WHERE  ( dbo.tblacc_cv.cv_docdate BETWEEN 
         '01/01/2018 00:00:00' AND '1/30/2018 23:59:59' ) 
GROUP  BY dbo.tblacc_cv.cv_docno, 
          dbo.tblacc_cv.cv_docdate, 
          dbo.tblacc_cv.cv_suppliername, 
          dbo.tblacc_glentry.gl_accountname, 
          dbo.tblacc_cv.cv_extdocno, 
          dbo.tblacc_chartaccount.coa_cvtype, 
          dbo.tblacc_glentry.gl_accountid, 
          dbo.tblacc_glentry.gl_credit, 
          dbo.tblacc_glentry.gl_amount, 
          dbo.tblacc_glentry.gl_debit 
ORDER  BY dbo.tblacc_cv.cv_docdate ASC 

样本输出

期望的输出

【问题讨论】:

  • any 查询的输出可以旋转。
  • 根据您的输出,您不需要数据透视...您只需要聚合这些列以删除 NULL,这也会为其他列选择一个值行不为空
  • 您的某些字段不是唯一的,因此您的数据透视表将无法将列组合在一起。例如 cvtypeglaccount_id
  • 另外,对于某些领域,您做出特定选择的标准是什么并不明显。示例:对于输出中的字段CVType,选择第一个值的标准是,还是总是显示“M”值?另外,是否有更多的值,如果有,进行选择的一般规则是什么? (编辑 - 请注意,根据您的查询,还有一个可能的“F”值。)
  • 我在其他帖子中看到的主要是SUM(CASE WHEN ... THEN ... END),而不是这个查询中的CASE WHEN .... THEN SUM(...) ELSE null END。这是不一样的!至于为什么你有 3 行,那是因为它也在 coa_cvtypegl_accountid 上分组,所以从 GROUP BY 或其他什么中删除它们。

标签: sql sql-server vb.net


【解决方案1】:

您想要的输出不是 PIVOT 的示例。

由于缺乏对您的逻辑的详细解释,我可以告诉您,您可以通过 GROUPing BY 前四列并将 MAX() 应用于所有其他列来获得所需的输出。 (cvtype 除外,这将是一个 MIN)。

【讨论】:

  • 或者,可能通过将 SUM() 应用于数字列。我们不知道有时每列是否有多行需要合并。如你所说,目前信息不足。
  • @LaughingVergil 是的,缺乏额外的解释,我们不知道很多事情。有多种方法可以从样本数据中获得所需的结果;这只是一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
相关资源
最近更新 更多