SQL Server:尝试在SELECT语句中使用SUM时出错

时间:2018-11-16 04:06:22

标签: sql sql-server

我有一个此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'

3 个答案:

答案 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作为分析/窗口功能。这意味着将为每行分配一个值,这与将SUMGROUP BYSUM(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