Elke groep door expressie moet ten minste één kolom bevatten die geen buitenste referentie is

Wat doe ik hier verkeerd? Ik krijg deze foutmelding op:

SELECT LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), 
            PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', 
            batchinfo.datapath), 8000))-1),
            qvalues.name,
            qvalues.compound,
            qvalues.rid
FROM batchinfo JOIN qvalues ON batchinfo.rowid=qvalues.rowid
WHERE LEN(datapath)>4
GROUP BY 1,2,3
HAVING rid!=MAX(rid)

Ik zou graag willen groeperen door de eerste, tweede en derde kolommen met de MAX RID.

het werkt prima zonder de groep door en hebben.


Antwoord 1, Autoriteit 100%

Om met u te beginnen, kan dit niet doen:

having rid!=MAX(rid)

Het hebben van de clausule kan alleen dingen bevatten die attributen van de geaggregeerde groepen zijn.

Bovendien is 1, 2, 3niet geldig in groep door in SQL Server – ik denk dat dat alleen geldig is in volgorde.

Kun je uitleggen waarom dit niet is wat je zoekt:

select 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound,
MAX(qvalues.rid)
 from batchinfo join qvalues on batchinfo.rowid=qvalues.rowid
where LEN(datapath)>4
group by LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound

Antwoord 2, autoriteit 72%

Nou, zoals eerder gezegd, je kunt niet GROUPmet letterlijke letters, ik denk dat je in de war bent, want je kunt ORDERvoor 1, 2, 3. Wanneer u functies als uw kolommen gebruikt, moet u op dezelfde expressie GROUPEREN. Trouwens, de HAVING-clausule is verkeerd, je kunt alleen gebruiken wat in de aggregaties staat. In dit geval zou uw vraag er als volgt uit moeten zien:

SELECT 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound,
MAX(qvalues.rid) MaxRid
FROM batchinfo join qvalues 
ON batchinfo.rowid=qvalues.rowid
WHERE LEN(datapath)>4
GROUP BY 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound

Antwoord 3, autoriteit 56%

Je kunt niet groeperen op letterlijke waarden, alleen op kolommen.

U zoekt waarschijnlijk zoiets als dit:

select 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1) as pathinfo,
qvalues.name,
qvalues.compound,
qvalues.rid
 from batchinfo join qvalues on batchinfo.rowid=qvalues.rowid
where LEN(datapath)>4
group by pathinfo, qvalues.name, qvalues.compound
having rid!=MAX(rid)

Allereerst moet je die eerste uitdrukking een kolomnaam geven met as. Vervolgens moet u de namen van de kolommen in de groep per uitdrukking specificeren.


Antwoord 4, autoriteit 4%

Ik denk dat je GROUP BY niet goed gebruikt.

Het punt van GROUP BY is om uw tabel in secties te organiseren op basis van een bepaalde kolom of kolommen voordat u wiskundige/aggregatiefuncties uitvoert.

Bijvoorbeeld in deze tabel:

Name    Age   Salary
Bob     25     20000
Sally   42     40000
John    42     90000

Een SELECT-instructie kan GROUP BY-naam zijn (Bob, Sally en John zouden elk afzonderlijke groepen zijn), Leeftijd (Bob zou één groep zijn, Sally en John zouden een andere zijn), of Salaris (vrijwel hetzelfde resultaat als naam) .

Groeperen op “1” heeft geen zin omdat “1” geen kolomnaam is.


Antwoord 5, autoriteit 4%

Ik heb zojuist deze fout gevonden tijdens het gebruik van GETDATE() [d.w.z. buitenste referentie] in de group by-clausule in een select-query.

Toen het werd vervangen door de datumkolom uit de respectieve tabel, werd het gewist.

Dacht om te delen als een eenvoudig voorbeeld. proost 😉


Antwoord 6

Als je GROUP BYgebruikt, moet je ook statistische functies gebruiken voor de kolommen die niet binnen je group by-clausule vallen.

Ik weet niet precies wat je probeert te doen, maar ik denk dat dit zou werken:

select 
    LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000),
    PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
    qvalues.name,
    qvalues.compound,
    MAX(qvalues.rid)
from
    batchinfo join qvalues on batchinfo.rowid=qvalues.rowid
where
    LEN(datapath)>4
group by
    LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000),
    PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
    qvalues.name,
    qvalues.compound
having
    rid!=MAX(rid)

bewerken:
Wat ik hier probeer te doen is een group bymet alle velden, maar rid. Als dat niet is wat u wilt, wat u moet doen om een ​​geldige SQL-instructie te hebben, wordt een geaggregeerde functie-oproep toegevoegd voor elke verwijderde groep per veld …


Antwoord 7

Hier is een eenvoudige query om bedrijfsnaam te vinden die een medicijntype van A heeft en meer dan 2 is.

SELECT CNAME 
FROM COMPANY 
WHERE CNO IN (
    SELECT CNO 
    FROM MEDICINE 
    WHERE type='A' 
    GROUP BY CNO HAVING COUNT(type) > 2
)

Other episodes