簡體   English   中英

SQL查詢-如何排除特定字段的WHERE

[英]SQL query - How to exclude WHERE for specific field

請參閱下面的SQL查詢,它工作正常。 它計算“是”,“否”,“其他”以及匹配的手機號碼的數量[銷售字段]( D.MobileNo = S.mobile

SELECT D.Username, 
      SUM(CASE WHEN D.type = 'Yes' THEN 1 ELSE 0 END) as Yes, 
      SUM(CASE WHEN D.type = 'Not' THEN 1 ELSE 0 END) as Not, 
      SUM(CASE WHEN D.type = '' THEN 1 ELSE 0 END) as Other, 
      SUM(CASE WHEN S.mobile IS NULL THEN 0 ELSE 1 END) as Sales, 
      COUNT(*) as TOTAL 
FROM dairy as D 
     LEFT JOIN (SELECT DISTINCT mobile FROM sales) as S on D.MobileNo = S.mobile 
WHERE source = 'Network' 
      AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 
      AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 
GROUP BY D.Username 
ORDER BY TOTAL DESC

我想在“ Sales字段中排除“ WHERE ”-它不應該是CheckDate一部分。 意味着它應檢查“ Sales字段中沒有CheckDatedairy表中的任何記錄。

那怎么辦?

如果您只想在一個查詢中獲得這些結果,則可以解決問題。

SELECT D.Username, 
    SUM(CASE WHEN D.type = 'Yes' AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 THEN 1 ELSE 0 END) as Yes, 
    SUM(CASE WHEN D.type = 'Not' AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 THEN 1 ELSE 0 END) as Not, 
    SUM(CASE WHEN D.type = ''    AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 THEN 1 ELSE 0 END) as Other, 
    SUM(CASE WHEN S.mobile IS NULL THEN 0 ELSE 1 END) as Sales, 
    COUNT(*) as TOTAL,
    SUM(CASE WHEN UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 THEN 1 ELSE 0 END) AS TOTALINCHECKDATE
FROM dairy as D 
   LEFT JOIN (SELECT DISTINCT mobile FROM sales) as S on D.MobileNo = S.mobile 
WHERE source = 'Network' 
GROUP BY D.Username 
ORDER BY TOTAL DESC

請注意,“ TOTAL”將計算所有行(包括不在CheckDate范圍內的行),TOTALINCHECKDATE返回的值與上一個查詢相同。

顯然,這仍然可以優化。

假設用戶名也存在於SALES表中

SELECT Username,SUM(Yes) As Yes, SUM(`Not`) As `Not`
  , SUM(Other) As Other, SUM(sales) Sales, SUM(total)
FROM (
-- get diary data
SELECT username,mobileNo As mobile, 
      CASE WHEN D.type = 'Yes' THEN 1 ELSE 0 END as Yes, 
      CASE WHEN D.type = 'Not' THEN 1 ELSE 0 END as `Not`, 
      CASE WHEN D.type = '' THEN 1 ELSE 0 END as Other, 
      0 As sales, 1 as total
FROM dairy as D 
WHERE source = 'Network' 
      AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 
      AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 

UNION ALL
-- get all sales
SELECT DISTINCT username,mobile, 0 as Yes, 0 as `Not`, 0 As Other, 1 As sales, 0 As total
FROM sales
  WHERE UNIX_TIMESTAMP(CheckDate) >= 1309474800 
      AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 
) AS a
GROUP BY Username

還可以嘗試在原始查詢中添加日期

SELECT D.Username, 
      SUM(CASE WHEN D.type = 'Yes' THEN 1 ELSE 0 END) as Yes, 
      SUM(CASE WHEN D.type = 'Not' THEN 1 ELSE 0 END) as Not, 
      SUM(CASE WHEN D.type = '' THEN 1 ELSE 0 END) as Other, 
      SUM(CASE WHEN S.mobile IS NULL THEN 0 ELSE 1 END) as Sales, 
      COUNT(*) as TOTAL 
FROM dairy as D 
     LEFT JOIN (SELECT DISTINCT mobile FROM sales WHERE UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 ) as S on D.MobileNo = S.mobile 
WHERE source = 'Network' 
      AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 
      AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 
GROUP BY D.Username 
ORDER BY TOTAL DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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