我有一个此SQL查询,我想在其中检索2005年8月的销售总额。每当我运行此查询时,都会收到错误消息“选择列表中的列无效,因为该列未包含在任何汇总中函数或GROUP BY子句”。如何解决此问题,使其显示所有列并在repsales.amount列中显示总和?
SELECT *, SUM(repsales.amount) AS amount
FROM repsales
WHERE repsales.saledate BETWEEN '2005-08-01' AND '2005-08-31'
答案 0 :(得分:2)
您可以使用窗口功能:
SELECT rs.*, SUM(rs.amount) OVER () AS total_amount
FROM repsales rs
WHERE rs.saledate BETWEEN '2005-08-01' AND '2005-08-31';
我的答案是使用SUM
作为分析/窗口功能。这意味着将为每行分配一个值,这与将SUM
与GROUP BY
和SUM(amount) OVER ()
进行使用形成对比。
使用import os
import itertools
from time import sleep
contadorArchivo = 0
def existeArchivo(nombre):
return os.path.isfile(nombre)
def existe_archivo_interno(nombre):
with open('hi','r') as arch:
for line in arch:
if line == nombre:
return True
else:
return False
def creaContenedor(nombre):
if existeArchivo(nombre):
archivo = open(nombre,'r')
archivo.close()
else:
print ("No se encontro el archivo base, creando...")
archivo = open(nombre,'w')
listaDeArchivos=("--%%Contenidos%%--")
archivo.write(listaDeArchivos)
archivo.close()
def error():
print ("Error, regresando al menu...")
sleep(4)
return menu()
def listar():
with open ('hi','r') as arch:
for line in arch:
if line == "--%%Contenidos%%--":
break
else:
print line
def crear():
print ("Ingresa el nombre del archivo a crear:\n>>")
nombre=raw_input()
if not existe_archivo_interno(nombre):
print ("Ingresa el contenido del archivo:\n")
cadena = raw_input()
nombre=nombre
with open('hi','r+') as arch:
archComoLista=arch.read().splitlines()
print archComoLista
archComoLista.insert(0,"\n"+nombre+"\n")
cadena = completa_cadena(cadena,nombre)
archComoLista.append(cadena)
print archComoLista
arch.writelines(archComoLista)
else:
print("Archivo ya existe!")
def completa_cadena(cadena,nombre):
cadena = "\n--%%Contenidos%%--I" + nombre + "\n" + cadena + "\n--%%Contenidos%%--F" + nombre
return cadena
def modificar():
print ("Ingresa el nombre del archivo a modificar(Solo agregar contenido):\n")
nombre=raw_input()
if existe_archivo_interno(nombre):
print ("Ingresa el contenido del archivo:\n")
cadena = raw_input()
with open('hi','r+') as arch:
archComoLista=arch.read().splitlines()
archComoLista.insert(final_cont(nombre)-1,cadena)
arch.writelines("\n".join(archComoLista))
else:
print ("No existe el archivo...")
sleep(2)
def final_cont(nombre):
posicion=0
with open('hi','r') as arch:
archComoLista=arch.read().splitlines()
posicion = archComoLista.index("--%%Contenidos%%--F" + nombre)
return posicion
def leer():
print ("Ingresa el nombre del archivo a leer:")
nombre=raw_input(">>")
if existe_archivo_interno(nombre):
with open ('hi','r') as arch:
arch.seek(posicion_inicial_cont(nombre))
for line in range(tamanio_contenido(nombre)):
print line
else:
print ("No existe el archivo...")
sleep(1)
def posicion_inicial_cont(nombre):
with open('hi','r') as arch:
archComoLista=arch.read().splitlines()
posicion=archComoLista.index("--%%Contenidos%%--I" + nombre)
return posicion
def borrar():
print ("Ingresa el nombre del archivo a borrar:\n>>")
nombre=raw_input()
if existe_archivo_interno(nombre):
with open('hi','r+') as arch:
archComoLista=arch.read().splitlines()
archComoLista.remove(nombre)
del archComoLista[posicion_inicial_cont(nombre),final_cont(nombre)]
arch.writelines("\n".join(archComoLista))
else:
print ("No existe el archivo")
sleep(2)
def leer_todo():
f = open('hi','r')
for line in f:
print line
def limite_de_Archivos():
with open('hi','r') as arch:
archComoLista=arch.read().splitlines()
posicion=archComoLista.index("--%%Contenidos%%--")
return posicion
def tamanio_contenido(nombre):
with open('hi','r') as arch:
archComoLista=arch.read().splitlines()
tamanio = archComoLista.index("--%%Contenidos%%I--"+nombre)-archComoLista.index("--%%Contenidos%%--F"+nombre)
return tamanio
def menu():
creaContenedor('hi')
salir = True
while salir:
print("\n")
print("Listar el directorio -> listar\n")
print("Crear Archivo -> crear\n")
print("Modificar Archivo -> mod\n")
print("Leer Archivo -> leer\n")
print("Borrar Archivo -> borrar\n")
print("Salir -> salir")
opc = raw_input("\n>>")
#leer_todo()
if opc == 'salir':
salir = False
elif opc == 'listar' :
listar()
elif opc == 'crear' :
crear()
elif opc == 'mod' :
modificar()
elif opc == 'borrar' :
borrar()
elif opc == 'leer' :
leer()
else:
error()
menu()
将窗口定义为整个表。也就是说,总和就是金额的总和。
答案 1 :(得分:0)
另一种替代解决方案是在select和groupby语句中逐一声明列名。即下面的示例按数据部门和类别分组:
select rs.department,rs.category,sum(rs.amount) as SumAmount
from repsales rs
where rs.saledate BETWEEN '2005-08-01' AND '2005-08-31';
group by rs.department, rs.category
如果需要所有列,则可以将以上查询的结果集保存在临时表中(从...中选择...到#temp中),然后像这样使用它:
select rs.*,t.SumSmount
from repsales rs
inner join #temp t on t.department=rs.department and t.category=rs.category
答案 2 :(得分:0)
将金额总和插入具有唯一值列dept,category等的临时表中...
Select rs.salespersonID, rs.OtherUniqueColumes, Sum(rs.amount) AS Amout
INTO #tempSales FROM repsales
WHERE repsales.saledate BETWEEN '2005-08-01' AND '2005-08-31'
Group By rs.salespersonID, rs.OtherUniqueColumes
将临时表与原始表连接起来以获取所有其他列
SELECT rs.*, t.Amount
FROM repSales rs INNER JOIN #tempSales t on rs.salespersonID = t.salespersonID AND rs.OtherUniqueColumes = t.OtherUniqueColumes
DROP TABLE #tempSales