首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询按元数据值分组字段

SQL查询按元数据值分组字段
EN

Stack Overflow用户
提问于 2021-10-08 09:39:22
回答 1查看 42关注 0票数 0

我有一个网络商店,与WOOCOMMERCE的工作,我需要一些统计数据。

我构建SQL查询,您可以在Code中找到它。

我需要一个"group by function for the pm.meta.value field“buchungsbezeichnung。

目前,每个p.posts条目都有一行。这是很多列,我必须使用excel-pivot来获得正确的统计数据。

对于每个元值"buchungsbezeichnung“,我只需要"Bankzahlung”列或"Mitgliedszahlung“列的和。

我尝试了很多,但我找不到正确的SQL查询。

请帮帮我。感谢齐格弗里德

代码语言:javascript
复制
  p.ID AS 'Order ID',
  CASE p.post_status
      WHEN 'wc-pending'    THEN 'Zahlung Ausstehend'
      WHEN 'wc-processing' THEN 'in Bearbeitung'
      WHEN 'wc-on-hold'    THEN 'Wartestellung'
      WHEN 'wc-completed'  THEN 'Best. ausgeliefert'
      WHEN 'wc-cancelled'  THEN 'Storniert'
      WHEN 'wc-refunded'   THEN 'Rückerstattet'
      WHEN 'wc-failed'     THEN 'Fehlgeschlagen'
      WHEN 'wc-ausgeliefert' THEN 'Ausgeliefert'
      WHEN 'wc-pfand' THEN 'Pfand'
      WHEN 'wc-bestellung-neu' THEN 'Bestellung Neu'
      WHEN 'wc-produzent-vorbest' THEN 'Bei Produzent vorbestellt'
      WHEN 'wc-produzent-best' THEN 'Bestellung b. Produzent'
      WHEN 'wc-ladenausgabe' THEN 'Ladenausgabe'
      WHEN 'wc-bewirtungsbeitrag' THEN 'Bewirtungsbeitrag'
      WHEN 'wc-enw-bank-gh-mi' THEN '11 W_Buchg. Bankueberw. GH'
      WHEN 'wc-enw-umbu-gh-vj' THEN '12 W_Buchg. Übertrag GH VJ'
      WHEN 'wc-enw-barz-gh-mi' THEN '13 W_Buchg. Barzahlung'
      WHEN 'wc-enw-nachl-vj' THEN '14 W_Buchg. Nachlass VJ'
      WHEN 'wc-env-bank-mb-mi' THEN '21 V_Buchg. Bankueberw. MB'
      WHEN 'wc-env-umbu-mb-vj' THEN '22 V_Buchg. Übertrag MB VJ'
      WHEN 'wc-env-bank-gh-so' THEN '23 V_Buchg. Verein Sonstiges'
      WHEN 'wc-agw-zahlung-prod' THEN '31 W_Buchg. Zahlg. RE Prod'
      WHEN 'wc-agw-umb-re-prod' THEN '31 W_Umbu. Zahlg. RE Prod Mitgl'
      WHEN 'wc-agv-austr-mitgl' THEN '32 W-Buchg. Zahlg. RZ Austritt'
      WHEN 'wc-agv-it' THEN '41 V-Buchg. Zahlg. RE IT'
      WHEN 'wc-agv-shop' THEN '42 V-Buchg. Zahlg. RE Shop'
      WHEN 'wc-agv-trans' THEN '43 V-Buchg. Zahlg. RE Trans'
      WHEN 'wc-agv-verw' THEN '44 V-Buchg. Zahlg. RE Verw' 
      WHEN 'wc-xxx-umbu-gh-mb' THEN '51 Umb. Guthaben zu MB'
      WHEN 'wc-ugw-u-zahlung-pro' THEN '52 Umb. Zahlg RE Prod d. Mitgl.'
      WHEN 'wc-gutschrift-mitgli' THEN '53 Gutschrift Mitgl.'
      WHEN 'wc-ugv-ausumb-it' THEN '61 Umb. Zahlg RE IT d. Mitgl.'
      WHEN 'wc-ugv-ausumb-shop' THEN '62 Umb. Zahlg RE Shop d. Mitgl.'
      WHEN 'wc-ugv-ausumb-trans' THEN '63 Umb. Zahlg RE Trans d. Mitgl.' 
      WHEN 'wc-ugv-ausumb-verw' THEN '64 Umb. Zahlg RE Verw d. Mitgl.' 
      WHEN 'wc-mitgliedsbeitrag' THEN '71 Ford. Mitgliedsbeitrag'
      WHEN 'wc-ford-mb-mahn' THEN '72 Ford-Mahn. Mitgliedsbeitrag'
    ELSE 'kein Status'
    END AS 'Status',
       
  MAX( CASE WHEN pm.meta_key = 'monatsverrechnung' AND p.ID = pm.post_id THEN pm.meta_value END ) AS 'Monatsverrechnung',
  MAX( CASE WHEN pm.meta_key = 'bilanzgruppe' AND p.ID = pm.post_id THEN pm.meta_value END ) AS 'Bilanzgruppe',
  MAX( CASE WHEN pm.meta_key = 'buchungsbezeichnung' AND p.ID = pm.post_id THEN pm.meta_value END ) AS 'Buchungsbez',
  MAX( CASE WHEN pm.meta_key = 'bilanzwert' AND p.ID = pm.post_id AND p.post_status = 'wc-ugw-u-zahlung-pro' THEN (0-pm.meta_value) END ) AS 'Bankzahlung',
  MAX( CASE WHEN pm.meta_key = 'bilanzwert' AND p.ID = pm.post_id AND p.post_status = 'wc-agw-zahlung-prod' THEN (pm.meta_value) END ) AS 'Mitgliedszahlung'
 
FROM  KtS4szE8u_posts AS p 
JOIN  KtS4szE8u_postmeta AS pm ON p.ID = pm.post_id

group by p.id

WHERE
    p.post_status  IN('wc-agw-zahlung-prod','wc-ugw-u-zahlung-pro')
EN

回答 1

Stack Overflow用户

发布于 2021-10-08 12:31:51

首先,现在和将来最好都有一个查询表,其中包含wc-pending、wc-processing、wc-on-hold等不同状态,并带有相应的标题。与尝试使用ID键作为状态/标题来回填数据库相比,下面这样的事情要容易得多。

代码语言:javascript
复制
Table PostStatus (lookup table with index on postStatus column)
PostStatusID  Post_Status           Post_Heading
1             wc-pending           Zahlung Ausstehend
2             wc-processing        in Bearbeitung
3             wc-on-hold           Wartestellung
4             wc-completed         Best. ausgeliefert
5             wc-cancelled         Storniert
etc... for all other entries.
xx            wc-mitgliedsbeitrag  71 Ford. Mitgliedsbeitrag

然后,您可以加入并简化您的案例以

代码语言:javascript
复制
select
      p.ID 'Order ID',
      coalesce( ps.post_heading, 'kein Status' ) Status,
      MAX( CASE WHEN pm.meta_key = 'monatsverrechnung' 
               THEN pm.meta_value END ) AS 'Monatsverrechnung',
      MAX( CASE WHEN pm.meta_key = 'bilanzgruppe' 
               THEN pm.meta_value END ) AS 'Bilanzgruppe',
      MAX( CASE WHEN pm.meta_key = 'buchungsbezeichnung' 
                THEN pm.meta_value END ) AS 'Buchungsbez',
      MAX( CASE WHEN pm.meta_key = 'bilanzwert' 
                    AND p.post_status = 'wc-ugw-u-zahlung-pro' 
                THEN (0-pm.meta_value) END ) AS 'Bankzahlung',
      MAX( CASE WHEN pm.meta_key = 'bilanzwert' 
                    AND p.post_status = 'wc-agw-zahlung-prod' 
                THEN (pm.meta_value) END ) AS 'Mitgliedszahlung'
    from 
      KtS4szE8u_posts AS p 
         -- using the LEFT-JOIN so you can get status readable values
         LEFT JOIN PostStatus ps 
            on p.post_status = ps.post_status
         -- now join for your meta data too
         JOIN  KtS4szE8u_postmeta pm 
            ON p.ID = pm.post_id
   group by 
      p.id
   WHERE
      p.post_status IN ('wc-agw-zahlung-prod', 'wc-ugw-u-zahlung-pro' )

因为WHERE子句只提取两个可能的状态代码,所以CASE语句的其余部分将只需要这两个可能的值,其余的甚至都不会出现在输出中。通过使用查找表,您仍然可以只使用2来获得您想要的任何可读标题,或者如果您有100个不同的状态代码,则可以获得100。

至于MAX( case/when )条件,您不需要显式添加和p.id = pm.post_id,因为这已经是连接条件的一部分。

现在,回到你原来的问题。你需要计算一些东西。听起来您需要将上面的内容包装到一个外部查询中,但您需要对其进行调整。但是,如果您没有查找表,并且一开始只处理两个可能的post状态值,那么也可以简化,因为我将在下面介绍,但您应该考虑实际的查找表。

代码语言:javascript
复制
select
      p.ID 'Order ID',
      -- again, simplified CASE/WHEN since your where clause is only ever
      -- returning records for these two status conditions
      case when p.post_status = 'wc-agw-zahlung-prod'
           then '31 W_Buchg. Zahlg. RE Prod'
           else '52 Umb. Zahlg RE Prod d. Mitgl.' end Status
      MAX( CASE WHEN pm.meta_key = 'monatsverrechnung' 
               THEN pm.meta_value END ) AS 'Monatsverrechnung',
      MAX( CASE WHEN pm.meta_key = 'bilanzgruppe' 
               THEN pm.meta_value END ) AS 'Bilanzgruppe',
      MAX( CASE WHEN pm.meta_key = 'buchungsbezeichnung' 
                THEN pm.meta_value END ) AS 'Buchungsbez',
      MAX( CASE WHEN pm.meta_key = 'bilanzwert' 
                    AND p.post_status = 'wc-ugw-u-zahlung-pro' 
                THEN (0-pm.meta_value) END ) AS 'Bankzahlung',
      MAX( CASE WHEN pm.meta_key = 'bilanzwert' 
                    AND p.post_status = 'wc-agw-zahlung-prod' 
                THEN (pm.meta_value) END ) AS 'Mitgliedszahlung'
    from 
      KtS4szE8u_posts AS p 
         JOIN  KtS4szE8u_postmeta pm 
            ON p.ID = pm.post_id
   group by 
      p.id
   WHERE
      p.post_status IN ('wc-agw-zahlung-prod', 'wc-ugw-u-zahlung-pro' )

现在,为了包装,使用我在上面发布的任何一种方法

代码语言:javascript
复制
select
      sum( case when PreSumResult.Status = '31 W_Buchg. Zahlg. RE Prod'
           then 1 else 0 end ) as CountOf31Posts,
      sum( case when PreSumResult.Status = '31 W_Buchg. Zahlg. RE Prod'
           then Mitgliedszahlung else 0 end ) as SumOfMitgliedszahlung,
      sum( case when PreSumResult.Status = '52 Umb. Zahlg RE Prod d. Mitgl.'
           then 1 else 0 end ) as CountOf52Posts,
      sum( case when PreSumResult.Status = '52 Umb. Zahlg RE Prod d. Mitgl.'
           then Bankzahlung else 0 end ) as SumOfBankzahlung 
   from
      ( either of the above queries ) as PreSumResult

因此,预查询已经使用元数据为您执行了聚合/分离限定符。然后,它成为外部查询的别名"PreSumResult“,分别获取相应的计数和求和值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69493743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档