2016-01-21 69 views
-2

我有這樣SQL查詢時,結果爲空

USER  itemnumber  datebought (YYYYmmDD) 

a   1   20160101 
b   2   20160202 
c   3   20160903 
d   4   20160101 

表現在我必須展示日期20160202(2016年2月2日)

我用過之後每個用戶購買的物品的總數

SELECT USER, COUNT(itemnumber)<br/> 
FROM TABLE<br/> 
WHERE datebought >= 20160202<br/> 
GROUP BY USER<br> 

它給我造成

b  1 
c  1 

但我想這樣

a  0 
b  1 
c  1 
d  0 

請告訴我什麼是最快捷的方法/有效的方法來做到這一點?

+2

您忘記標記其他** RDBMS **產品,例如'postgresql','db2'等 –

+0

不能,它只允許5個:)我認爲這是一個諷刺性的評論:p – Aiden

+0

爲什麼要標記幾個不同的dbms產品,然後接受針對這些產品之一的產品特定答案!不要標記產品無法啓動! – jarlh

回答

3

嘗試這樣,

 DECLARE @table TABLE 
    (
    [USER]  VARCHAR(1), 
    itemnumber INT, 
    datebought DATE 
) 
INSERT INTO @TABLE VALUES 
('a',1,'20160101'), 
('b',2,'20160202'), 
('b',2,'20160202'), 
('b',2,'20160202'), 
('c',3,'20160903'), 
('d',4,'20160101') 

SELECT * 
FROM @TABLE 

SELECT [USER], 
     Sum(CASE 
      WHEN datebought >= '20160202' THEN 1 
      ELSE 0 
      END) AS ITEMCOUNT 
FROM @TABLE 
GROUP BY [USER] 
+0

非常感謝:)如果USER b有兩個以上的項目,那麼語句「THEN 1」應該改爲SUM(itembought)?否則它會一直給1? – Aiden

+0

對於特定用戶有兩個項目,則它返回2.(根據日期檢查,總是返回1或0),所以1加1的和爲2。請參考最新的答案。我已向您的方案提供了示例數據。 – StackUser

+0

哇,這是天才!這是工作!我會試着理解你寫的很好的邏輯,並會使用它:)非常感謝「NewUser」:)乾杯!我認爲問題是用你的答案解決的! – Aiden

1

使用此

SELECT USER, COUNT(itemnumber) 
     FROM TABLE 
     WHERE datebought >= 20160202 
     GROUP BY USER 
+0

對不起,輸入錯誤。我用USER組,但它給了我這樣的結果。我正在考慮使用CASE,當然,還有一些人加入,但不知道如何做這件事。使用datebought> 20160202只是從結果中刪除USER a和USER b。 – Aiden

0

雖然此查詢將不會是大數據量的一個好主意:

SELECT USER, COUNT(itemnumber) 
    FROM TABLE 
WHERE datebought >= 20160202 
GROUP BY USER 
UNION 
SELECT DISTINCT USER, 0 
    FROM TABLE 
WHERE datebought < 20160202 
+0

謝謝,你是對的:)我認爲最好還是採用其他解決方案。我們可以用CASE語句來做到嗎? – Aiden

+0

@Aiden:請試試我剛剛發佈的答案 – StackUser

+0

我認爲CASE的查詢性能幾乎(如果不完全相同),因爲它必須讀取用戶,itemnumber和datebought的所有值。根據數據的不同,使用union的版本可能會更快,因爲它不需要爲datebought <20160202做值。 – stee1rat

0
USE tempdb 
GO 
DROP TABLE test1 
CREATE TABLE test1(a NVARCHAR(10), ino INT, datebought INT) 
INSERT INTO dbo.test1 
     (a, ino, datebought) 
VALUES ('a' ,   1 ,  20160101) 
INSERT INTO dbo.test1 
     (a, ino, datebought) 
VALUES ('b' ,   2 ,  20160202) 

INSERT INTO dbo.test1 
     (a, ino, datebought) 
VALUES ('c' ,   3 ,  20160903) 

INSERT INTO dbo.test1 
     (a, ino, datebought) 
VALUES ('d' ,   4 ,  20160101) 

SELECT * FROM dbo.test1 

SELECT a, COUNT(ino) OVER(PARTITION BY a) FROM dbo.test1 
WHERE datebought>=20160202 
UNION ALL 
SELECT a, 0 FROM dbo.test1 
WHERE datebought<20160202 
ORDER BY a 
+0

爲什麼你需要在這裏? – stee1rat

+0

您可以將datebought修改爲date/datetime並根據需要重構查詢 – autopilot