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有多少,任何想法?
答案 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
之后使用它来告诉数据库只返回唯一的行,或者它可以在聚合函数中使用(即min
,max
,{ {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的答案是恰当的。