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, 3
niet 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 GROUP
met letterlijke letters, ik denk dat je in de war bent, want je kunt ORDER
voor 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 BY
gebruikt, 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 by
met 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
)