select
column1 -- this is NOT using an aggregate function
, min(column99) -- this IS using an aggregate function
, avg(column99) -- this IS using an aggregate function
, max(column99) -- this IS using an aggregate function
from t
where column2 in (1,2,3) and column27 > 67
group by
column1 -- list ALL "not using aggregate functions" here
where clause
의해기를 사용하여 선택 쿼리 활성 및 가능한 유지되지만 where clause
집계 값에 기초하여 데이터를 필터링 할 수 없다. 따라서 having clause
이 집계 된 값을 평가하기 위해 도입되었습니다. having clause
에서 참조되는 참고 집계는 select 절에 나타나지 않아도됩니다.
select
column1 -- this is NOT using an aggregate function
from t
where column2 in (1,2,3) and column27 > 67
group by
column1 -- list ALL "not using aggregate functions" here
having count(*) > 1 -- aggregated value evaluated (& not shown in select clause)
CREATE TABLE [Produits] (
[ID] INTEGER NOT NULL IDENTITY(1, 1),
[numprod] INTEGER NULL,
[designation] VARCHAR(255) NULL,
[numfour] VARCHAR(15) NULL,
[prix] VARCHAR(10) NULL,
[col5] INTEGER NULL,
[col6] VARCHAR(11) NULL,
PRIMARY KEY ([ID])
);
INSERT INTO Produits([numprod],[designation],[numfour],[prix],[col5],[col6]) VALUES(1766,'OUQ87WSF2KI','10912630-6','42978',1001,'92392128299'),(8905,'JXN18MFY2QB','8214783-7','978037',1004,'71223346099'),(1265,'SJQ75RPS5HZ','45613175-1','3870',1007,'43238318399'),(8629,'RSE36KPM5IF','48773702-K','2133 KE',1010,'15529503099'),(8881,'LLG26FAS8XW','8970418-9','9761',1013,'59451591999'),(9108,'XWF03JNH8JA','22373189-9','60126',1016,'31945010599'),(6592,'OZZ67VLQ6SJ','38157300-1','M0X 2Z6',1019,'72579276999'),(3110,'UCH88BDN5CB','19601141-2','YC8 0LD',1022,'66731372399'),(6873,'FBJ64LAA7QL','32961199-K','9959',1025,'34231409299'),(7386,'HLI81PRP6NO','49014829-9','M3N 3M7',1028,'63232963699');
SELECT distinct numprod, dateadd(day,7-(row_number() over(order by numprod))*7,getdate()) as datec
into Commandes
FROM Produits
UNION ALL
SELECT distinct numprod, dateadd(day,12-(row_number() over(order by numprod))*8,getdate()) as datec
FROM Produits
;
select
*
from Commandes
order by numprod, datec DESC
;
numprod | datec
------: | :------------------
1265 | 01/11/2017 08:27:30
1265 | 28/10/2017 08:27:30
1766 | 24/10/2017 08:27:30
1766 | 21/10/2017 08:27:30
3110 | 16/10/2017 08:27:30
3110 | 14/10/2017 08:27:30
6592 | 08/10/2017 08:27:30
6592 | 07/10/2017 08:27:30
6873 | 30/09/2017 08:27:30
6873 | 30/09/2017 08:27:30
7386 | 23/09/2017 08:27:30
7386 | 22/09/2017 08:27:30
8629 | 16/09/2017 08:27:30
8629 | 14/09/2017 08:27:30
8881 | 09/09/2017 08:27:30
8881 | 06/09/2017 08:27:30
8905 | 02/09/2017 08:27:30
8905 | 29/08/2017 08:27:30
9108 | 26/08/2017 08:27:30
9108 | 21/08/2017 08:27:30
SELECT P.numprod, P.designation, P.numfour, P.prix, max(c.datec) max_datec
FROM Produits P
INNER JOIN Commandes C ON C.numprod = P.numprod
GROUP BY P.numprod, P.designation, P.numfour, P.prix
;
numprod | designation | numfour | prix | max_datec
------: | :---------- | :--------- | :------ | :------------------
1265 | SJQ75RPS5HZ | 45613175-1 | 3870 | 01/11/2017 08:27:30
1766 | OUQ87WSF2KI | 10912630-6 | 42978 | 24/10/2017 08:27:30
3110 | UCH88BDN5CB | 19601141-2 | YC8 0LD | 16/10/2017 08:27:30
6592 | OZZ67VLQ6SJ | 38157300-1 | M0X 2Z6 | 08/10/2017 08:27:30
6873 | FBJ64LAA7QL | 32961199-K | 9959 | 30/09/2017 08:27:30
7386 | HLI81PRP6NO | 49014829-9 | M3N 3M7 | 23/09/2017 08:27:30
8629 | RSE36KPM5IF | 48773702-K | 2133 KE | 16/09/2017 08:27:30
8881 | LLG26FAS8XW | 8970418-9 | 9761 | 09/09/2017 08:27:30
8905 | JXN18MFY2QB | 8214783-7 | 978037 | 02/09/2017 08:27:30
9108 | XWF03JNH8JA | 22373189-9 | 60126 | 26/08/2017 08:27:30
,536,913 63,210
SELECT P.numprod, P.designation, P.numfour, P.prix, max(c.datec) max_datec
FROM Produits P
INNER JOIN Commandes C ON C.numprod = P.numprod
GROUP BY P.numprod, P.designation, P.numfour, P.prix
HAVING max(c.datec) < '20170905'
;
numprod | designation | numfour | prix | max_datec
------: | :---------- | :--------- | :----- | :------------------
8905 | JXN18MFY2QB | 8214783-7 | 978037 | 02/09/2017 08:27:30
9108 | XWF03JNH8JA | 22373189-9 | 60126 | 26/08/2017 08:27:30
dbfiddle here
원래 쿼리는이 SQL 서버 오류가 발생 select p.*
를 사용하여 작동하지 않습니다
SELECT P.*
FROM Produits P
INNER JOIN Commandes C ON C.numprod = P.numprod
GROUP BY P.numprod, P.designation, P.numfour, P.prix
GO
Msg 8120 Level 16 State 1 Line 1
Column 'Produits.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
dbfiddle here
어떤 종류의 오류가 발생합니까? 당신이'c.datec'에'max'를 사용하지 않는다면? – Simon
아니요! '2017-05-09'보다 적은 날짜가 있으면 아무런 오류없이 응답 할 수 있습니다. –
검색어가 작동해야합니다. 아마도 그 설명에 맞는 제품이 없을 것입니다. –