【问题标题】:Count Nested Case in SQL [closed]在 SQL 中计算嵌套案例 [关闭]
【发布时间】:2020-02-27 06:34:11
【问题描述】:

我想用 id_user 和 id_train 显示行训练 可以在count函数sql中嵌套case语句吗?

我的 SQL 在这里,但它出错了

SELECT ticket.*
       , COUNT( CASE trans.id_user WHEN 1 THEN 1  
CASE trans.id_train WHEN 1 THEN 1
ELSE NULL END) AS total_ticket
       , SUM(train.price) AS total_price
       , user.* 
FROM train JOIN trans ON trans.id_train = kereta.id_train 
JOIN user ON trans.id_user = user.id_user 
JOIN ticket ON ticket.train = train.id_train;

【问题讨论】:

    标签: mysql sql database heidisql


    【解决方案1】:
    COUNT( CASE trans.id_user  WHEN 1 THEN 1  
           CASE trans.id_train WHEN 1 THEN 1
                               ELSE NULL END ) AS total_ticket
    

    结构不明。看起来您需要以下变体之一。

    COUNT( CASE WHEN trans.id_user  = 1 THEN 1  
                WHEN trans.id_train = 1 THEN 1
                                        ELSE NULL END ) AS total_ticket
    -- which may be simplified to 
    SUM(1 IN (trans.id_user, trans.id_train)) AS total_ticket
    
    COUNT( CASE WHEN trans.id_user  = 1 
                 AND trans.id_train = 1 THEN 1
                                        ELSE NULL END ) AS total_ticket
    -- which may be simplified to 
    SUM(trans.id_user  = 1 AND trans.id_train = 1) AS total_ticket
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      select COUNT( CASE trans.id_user WHEN 1 
                                       THEN 1  
                                       ELSE NULL 
                    END) first_cnt
             , COUNT( CASE trans.id_train WHEN 1 
                                          THEN 1  
                                          ELSE NULL 
                      END) second_cnt
      from trans;
      

      但是,如果您想将任何其他列添加到您需要按该列分组的选择中:

      select trans.some_column
             , COUNT( CASE trans.id_user WHEN 1 
                                       THEN 1  
                                       ELSE NULL 
                    END) first_cnt
             , COUNT( CASE trans.id_train WHEN 1 
                                          THEN 1  
                                          ELSE NULL 
                      END) second_cnt
      from trans
      group by trans.some_column;
      

      在您的情况下,这意味着您需要按工单中的所有列进行分组,因为您使用:ticket.*,所有来自用户的列,因为您使用 user.*

      另外请注意,以上所有内容都可以应用于您选择的SUM

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-18
        相关资源
        最近更新 更多