2016-01-21 82 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