2009-12-18 63 views
2

目前此查詢:SQL選擇那裏是隻有一個日期

SELECT  InvoiceNumber, CustomerCode, Amount, InvoiceDate 
FROM   Invoice 

返回:

aaa, 111, 5, 07/12/2009 
bbb, 111, 5, 07/11/2009 
ccc, 222, 5, 07/12/2009 

不過,我想寫:Where date = '07/12/2009',但我只想要返回的結果那裏客戶只有一張發票...

因此,客戶代碼222將被退回,但111不會,因爲111已經有前幾個月的發票....

希望你能幫助! :d

+0

哪個RDBMS? MySQL,SQL Server,Oracle等? – MartW 2009-12-18 12:25:09

+0

Sql服務器。下面沒有一個似乎在工作,但試圖找出它 – Will 2009-12-18 12:31:36

+0

你可以給出更多的細節,預期的輸出是什麼?我看到3個答案似乎滿足我對您的要求的理解。 – MartW 2009-12-18 12:40:08

回答

-1

試試這個萌芽

SELECT  InvoiceNumber, CustomerCode, Amount, InvoiceDate, (SELECT count(*) FROM Invoice b WHERE a.CustomerCode=b.CustomerCode AND InvoiceDate = '07/12/2009') as count 
FROM   Invoice a 
Where InvoiceDate = '07/12/2009' 
HAVING count = 1 
+0

This works,just tried it – Clash 2009-12-18 12:22:04

-1

這應該這樣做:

SELECT 
    InvoiceNumber, CustomerCode, Amount, InvoiceDate 
FROM 
    Invoice 
WHERE 
    COUNT(id) = 1 AND InvoiceDate = '07/12/2009' 
GROUP BY 
    InvoiceDate 
+0

聚合可能不會出現在WHERE子句中,除非它位於包含在HAVING子句或選擇列表中的子查詢中,並且要聚合的列是外部引用。 – 2009-12-18 18:24:03

0

試試這個:

SELECT  InvoiceNumber, CustomerCode, Amount, InvoiceDate 
FROM  Invoice AS Inv 
INNER JOIN 
(
    SELECT CustomerCode 
    FROM Invoice 
    GROUP BY CustomerCode 
    HAVING COUNT(*) = 1 
) AS base 
ON  Inv.CustomerCode = base.CustomerCode 
WHERE InvoiceDate = '07/12/2009' 
1
DECLARE @DateParam datetime 
SELECT @DateParam = Convert(datetime, '07/12/2009', 103) 

SELECT InvoiceNumber, CustomerCode, Amount, InvoiceDate 
FROM Invoice 
INNER JOIN (SELECT CustomerCode 
    FROM Invoice 
    GROUP BY CustomerCode 
    HAVING Count(*) = 1) AS InvoiceCount ON Invoice.CustomerCode = InvoiceCount.CustomerCode 
WHERE InvoiceDate = @DateParam 

這將返回的任何地方與invoiceDate等於@DateParam,並且只有一張發票對於整個發票表格中的客戶。

0
SELECT i.InvoiceNumber, i.CustomerCode, i.Amount, i.InvoiceDate 
FROM  Invoice i 
WHERE i.InvoiceDate = '7/12/2009' 
AND i.InvoiceNumber IN (
    SELECT MAX(InvoiceNumber) 
    FROM Invoice  
    GROUP BY CustomerCode 
    HAVING COUNT(*) = 1 
) 
+0

除非您使用聚合,否則不能在您的子查詢的選擇列表中放入InvoiceNumber。 MAX(發票號碼)將工作。 – 2009-12-18 18:27:23

1

你可以嘗試這樣的事情

DECLARE @Table TABLE(
     InvoiceNumber VARCHAR(10), 
     CustomerCode VARCHAR(10), 
     Amount FLOAT, 
     InvoiceDate DATETIME 
) 

INSERT INTO @Table (InvoiceNumber,CustomerCode,Amount,InvoiceDate) SELECT 'aaa', '111', 5, '07/12/2009' 
INSERT INTO @Table (InvoiceNumber,CustomerCode,Amount,InvoiceDate) SELECT 'bbb', '111', 5, '07/11/2009' 
INSERT INTO @Table (InvoiceNumber,CustomerCode,Amount,InvoiceDate) SELECT 'ccc', '222', 5, '07/12/2009' 

SELECT t.* 
FROM @Table t INNER JOIN 
     (
      SELECT CustomerCode 
      FROM @Table 
      GROUP BY CustomerCode 
      HAVING COUNT(CustomerCode) = 1 
     ) s ON t.CustomerCode = s.CustomerCode 
WHERE t.InvoiceDate = '07/12/2009' 
-1

至於建議,這一次似乎下SQLSERVER不被接受

SELECT * 
FROM Invoice i 
INNER JOIN (
    SELECT CustomerCode, InvoiceDate 
    FROM Invoice 
    WHERE InvoiceDate='07/12/2009' 
    GROUP BY CustomerCode 
    HAVING COUNT(CustomerCode)=1 
) grp ON (i.CustomerCode=grp.CustomerCode AND i.InvoiceDate=grp.InvoiceDate) 

,或者如果發票號是唯一的

SELECT * 
FROM Invoice i 
INNER JOIN (
    SELECT InvoiceNumber 
    FROM Invoice 
    WHERE InvoiceDate='07/12/2009' 
    GROUP BY CustomerCode 
    HAVING COUNT(CustomerCode)=1 
) grp ON (i.InvoiceNumber =grp.InvoiceNumber) 
+0

這將返回具有多個發票的客戶,因爲WHERE子句在GROUP BY之前過濾結果。 – 2009-12-18 18:25:15

+0

是的,我忘記了最後一個的日期 – Patrick 2009-12-18 18:29:04

+0

如果發票是唯一的,我添加了另一個 – Patrick 2009-12-18 18:38:00

1
SELECT 
    MAX(InvoiceNumber) AS InvoiceNumber 
,CustomerCode 
,MAX(Amount) AS Amount 
,MAX(InvoiceDate) AS InvoiceDate 
FROM Invoice 
GROUP BY CustomerCode 
HAVING COUNT(*) = 1 
    AND MAX(InvoiceDate) = '07/12/2009' 
相關問題