[英]Distinct inside a CASE WHEN 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的數量,有什么想法嗎?
我認為您要查找的查詢是聚合查詢:
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
Distinct
不是函數,它是可以以多種方式使用的關鍵字。 在select
后可以使用if告訴數據庫僅返回唯一的行,或者可以在聚合函數(即min
, max
, count
等)內使用if來告訴該函數應僅將其應用於唯一的集合該字段的值。 在前一種情況下,幾乎可以在任何查詢中使用它,但是在后一種情況下(例如您的查詢),該查詢必須具有group by
子句。
如之前所建議的,對於您而言,似乎最簡單的解決方案是將count
函數中的distinct
關鍵字移至:
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
此解決方案將提供一個結果行,該行將匯總整個表。 如果您希望每行trip_no
,@Gordon Linoff的答案是合適的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.