2017-10-27 1 views
0

는 나는 내가 무엇을 기본적으로, 그래서 날짜 이후에 명령 한 적이 한 제품을 검색하기 위해 노력하고있어 :Having 절에서 견인 날짜를 SQL Server에서 비교하는 방법은 무엇입니까?

SELECT P.* 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) < '2017-05-09' 

을하지만 그것은 단지 내가 MAX() 옆에 등호를 사용하는 경우 작동하고 있다는 점에서 아무것도 돌려주지 않는 것 케이스. 나는 어떤 설명이든 인정 될 것이고 어떤 언어 실수라도 유감스럽게 생각합니다.

+0

어떤 종류의 오류가 발생합니까? 당신이'c.datec'에'max'를 사용하지 않는다면? – Simon

+0

아니요! '2017-05-09'보다 적은 날짜가 있으면 아무런 오류없이 응답 할 수 있습니다. –

+0

검색어가 작동해야합니다. 아마도 그 설명에 맞는 제품이 없을 것입니다. –

답변

0

내 생각에 invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause...과 같은 오류가 발생하여 having 문에 max을 사용하는 것입니다. 그 문장에서 max를 사용하면 오류는 해결되지만 가장 큰 날짜가 주어 지므로 결과가 돌아 오지 않을 가능성이 큽니다.

시도 :

select * 
from 
(SELECT P.* FROM Produits P 
INNER JOIN Commandes C ON C.numprod = P.numprod 
where C.datec < '2017-05-09' 
) t 
GROUP BY t.numprod, t.designation, t.numfour, t.prix 
+0

Simon에게 감사드립니다.이 구문에 대해 전혀 알지 못했기 때문에이 구문에 대해 말해 주시겠습니까? 그리고 그 날짜 이전에 명령 된 제품이 반환되었습니다. 그 날짜 이후에 다시는 명령하지 않은 사람은 누구입니까? –

0

SQL 92 개 표준 집계 함수를 사용하지 않는 select 절, 에 사용 된 모든 열이 group by clause에 포함되어야 할 것을 요구하고 있습니다. 예 :

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

+0

질문이 지금 해결 되었습니까?이 답변에 대해 질문이 있습니까? [help/accepting] (https://stackoverflow.com/help/someone-answers)를 보려면 "[** 클릭 **] (https://ibb.co/ikqyO6)"을 수락하고 답변하십시오. –

관련 문제