SQL中的CASE内部区别

时间:2013-12-03 16:49:03

标签: sql

SELECT
    SUM(NormalCount) NormalCount,
    SUM(DiscountCount) DiscountCount,
    SUM(TotalAmountNormal) TotalAmountNormal,
    SUM(TotalAmountDiscounted) TotalAmountDiscounted,
    COUNT(Trip_No) TotalTrip
  FROM
  (

  SELECT
    CASE WHEN PriceType_ID=0 THEN 1 ELSE 0 END NormalCount,
    CASE WHEN PriceType_ID<>0 THEN 1 ELSE 0 END DiscountCount,
    CASE WHEN PriceType_ID=0 THEN Amount END TotalAmountNormal,
    CASE WHEN PriceType_ID<>0 THEN Amount ELSE 0 END TotalAmountDiscounted,
    DISTINCT(Trip_No) //here error

    FROM "Tbl_Ticket"
    WHERE strftime('%Y-%m-%d', datetime('now'), 'localtime') = strftime('%Y-%m-%d', Ticket_Date)
    AND Vehicle_ID=1
    AND Driver_ID=1
    AND Route_ID=93
    AND Ticket_Date BETWEEN strftime('%Y-%m-%d %H:%M:%S', "2013-12-04 00:21:07") AND strftime('%Y-%m-%d %H:%M:%S', "2013-12-04 00:50:50")
 ) t

我想区分Trip_No并计算trip_no有多少,任何想法?

2 个答案:

答案 0 :(得分:4)

我认为您正在寻找的查询是一个聚合查询:

SELECT sum(CASE WHEN PriceType_ID=0 THEN 1 ELSE 0 END) as NormalCount,
       sum(CASE WHEN PriceType_ID<>0 THEN 1 ELSE 0 END) as DiscountCount,
       sum(CASE WHEN PriceType_ID=0 THEN Amount END) as TotalAmountNormal,
       sum(CASE WHEN PriceType_ID<>0 THEN Amount ELSE 0 END) as TotalAmountDiscounted,
       Trip_No
FROM "Tbl_Ticket"
WHERE strftime('%Y-%m-%d', datetime('now'), 'localtime') = strftime('%Y-%m-%d', Ticket_Date)
      AND Vehicle_ID=1
      AND Driver_ID=1
      AND Route_ID=93
      AND Ticket_Date BETWEEN strftime('%Y-%m-%d %H:%M:%S', "2013-12-04 00:21:07") AND strftime('%Y-%m-%d %H:%M:%S', "2013-12-04 00:50:50")
group by trip_no

答案 1 :(得分:2)

Distinct不是一个功能,它是一个可以通过多种方式使用的关键字。如果可以在select之后使用它来告诉数据库只返回唯一的,或者它可以在聚合函数中使用(即minmax,{ {1}}等)告诉该函数它应该仅应用于该字段的唯一值集。在前一种情况下,它几乎可以用于任何查询,但在后一种情况下(例如你的)查询必须有一个count子句。

如前所述,对于您来说,最简单的解决方案似乎是将group by关键字移到distinct函数中:

count

此解决方案将提供单个结果行,该行将汇总整个表。如果你想要每SELECT SUM(NormalCount) NormalCount, SUM(DiscountCount) DiscountCount, SUM(TotalAmountNormal) TotalAmountNormal, SUM(TotalAmountDiscounted) TotalAmountDiscounted, COUNT(DISTINCT Trip_No) TotalTrip FROM( SELECT CASE WHEN PriceType_ID=0 THEN 1 ELSE 0 END NormalCount, CASE WHEN PriceType_ID<>0 THEN 1 ELSE 0 END DiscountCount, CASE WHEN PriceType_ID=0 THEN Amount END TotalAmountNormal, CASE WHEN PriceType_ID<>0 THEN Amount ELSE 0 END TotalAmountDiscounted, trip_no FROM "Tbl_Ticket" WHERE strftime('%Y-%m-%d', datetime('now'), 'localtime') = strftime('%Y-%m-%d', Ticket_Date) AND Vehicle_ID=1 AND Driver_ID=1 AND Route_ID=93 AND Ticket_Date BETWEEN strftime('%Y-%m-%d %H:%M:%S', "2013-12-04 00:21:07") AND strftime('%Y-%m-%d %H:%M:%S', "2013-12-04 00:50:50") ) t 行一行,@ Gordon Linoff的答案是恰当的。