簡體   English   中英

在SQL中的情況下不同

[英]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告訴數據庫僅返回唯一的行,或者可以在聚合函數(即minmaxcount等)內使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM