我有一个表,其中包含商品代码,日期和数量。
我想寻找的是同一件商品的数量与上一日期相比增加或减少了10倍。
例如,我有以下几列
Article Date Quantity X10
1001 20-01-2015 22
1001 21-02-2016 220
对于数量为220的行,应在x10列中将其标记为x。
我尝试的是以下
UPDATE ph
SET [X10] = 'Px10'
FROM
[dbo].[Sales] ph
inner join [dbo].[Sales] t on (ph.[Article] = t.[Article])
WHERE
ph.[quantity] / t.[quantity] = 10
OR
t.[quantity] / ph.[quantity] = 10;
答案 0 :(得分:0)
尝试以下操作:
select *,
case when exists
(
select 1
from yourtable t2
where dateadd(day,-1,t1.[Date])=t2.[Date]
and t1.Quantity>=10*t2.Quantity
) then 'x' else '' end as 'x10'
from youttable t1
答案 1 :(得分:0)
尝试一下。
#include<ntddk.h>
#include<ntstrsafe.h>
#define IOCTL_ADD_BLAPP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_READ_DATA)
#define IOCTL_REM_BLAPP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_READ_DATA)
#define MAX_PATH 255
ULONG g_NotifyRegistered = FALSE;
PDEVICE_OBJECT g_pDeviceObject;
UNICODE_STRING g_usDeviceName = RTL_CONSTANT_STRING(L"\\Device\\BLDev");
UNICODE_STRING g_usSymbolicLink = RTL_CONSTANT_STRING(L"\\DosDevices\\BLDev");
VOID OnProcessCreation(
PEPROCESS Process,
HANDLE ProcessId,
PPS_CREATE_NOTIFY_INFO CreateInfo
)
{
UNREFERENCED_PARAMETER(Process);
UNREFERENCED_PARAMETER(ProcessId);
if (CreateInfo == NULL)
return;
if (CreateInfo->ImageFileName == NULL || CreateInfo->CommandLine == NULL)
return;
if (CreateInfo->ImageFileName->Buffer == NULL || CreateInfo->CommandLine->Buffer == NULL)
return;
DbgPrint("ImageFileName : %wZ \n", CreateInfo->ImageFileName);
DbgPrint("Commandline : %wZ \n", CreateInfo->CommandLine);
}
VOID Unload(PDRIVER_OBJECT pDriverObject)
{
UNREFERENCED_PARAMETER(pDriverObject);
if (g_NotifyRegistered)
{
NTSTATUS status = PsSetCreateProcessNotifyRoutineEx(
OnProcessCreation,
TRUE
);
switch (status)
{
case STATUS_SUCCESS:
DbgPrint("Process creation notification successfully unregistered.\n");
break;
case STATUS_INVALID_PARAMETER:
DbgPrint("Invalid parameters.\nFailed to unregister for process creation notification.\n");
status = STATUS_UNSUCCESSFUL;
break;
case STATUS_ACCESS_DENIED:
DbgPrint("Access denied.\nFailed to unregister for process creation notification.\n");
status = STATUS_UNSUCCESSFUL;
break;
}
}
IoDeleteSymbolicLink(&g_usSymbolicLink);
IoDeleteDevice(g_pDeviceObject);
DbgPrint("Driver unloaded.\n");
}
NTSTATUS DispatchDeviceControl(
PDEVICE_OBJECT pDeviceObject,
PIRP pIrp
)
{
UNREFERENCED_PARAMETER(pDeviceObject);
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION pIOStackLoc = IoGetCurrentIrpStackLocation(pIrp);
size_t returnLength = 0;
WCHAR wzInParam[MAX_PATH] = L"";
PVOID buffer = pIrp->AssociatedIrp.SystemBuffer;
switch (pIOStackLoc->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_ADD_BLAPP:
wcsncpy(buffer, wzInParam, MAX_PATH);
returnLength = (wcsnlen(buffer, MAX_PATH) + 1) * 2;
DbgPrint("Adding : %wZ\n", wzInParam);
break;
case IOCTL_REM_BLAPP:
wcsncpy(buffer, wzInParam, MAX_PATH);
returnLength = (wcsnlen(buffer, MAX_PATH) + 1) * 2;
DbgPrint("Removing : %wZ\n", wzInParam);
break;
default:
status = STATUS_INVALID_PARAMETER;
}
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = returnLength;
IoCompleteRequest(
pIrp,
IO_NO_INCREMENT
);
return status;
}
VOID OnProcessCreation(
PEPROCESS Process,
HANDLE ProcessId,
PPS_CREATE_NOTIFY_INFO CreateInfo
);
NTSTATUS DriverEntry(
PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pusRegistryPath
)
{
UNREFERENCED_PARAMETER(pusRegistryPath);
NTSTATUS status = STATUS_SUCCESS;
pDriverObject->DriverUnload = Unload;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
status = IoCreateDevice(
pDriverObject,
0,
&g_usDeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&g_pDeviceObject
);
if (!NT_SUCCESS(status))
{
DbgPrint("Failed to createDevice.\n");
return STATUS_UNSUCCESSFUL;
}
else
DbgPrint("Device created successfully.\n");
status = IoCreateSymbolicLink(
&g_usSymbolicLink,
&g_usDeviceName
);
if (!NT_SUCCESS(status))
{
DbgPrint("Failed to create symbolic link.\n");
IoDeleteDevice(g_pDeviceObject);
return STATUS_UNSUCCESSFUL;
}
else
DbgPrint("Symbolic link created successfully.\n");
status = PsSetCreateProcessNotifyRoutineEx(
OnProcessCreation,
FALSE
);
switch (status)
{
case STATUS_SUCCESS:
DbgPrint("Process creation notification successfully registered.\n");
g_NotifyRegistered = TRUE;
break;
case STATUS_INVALID_PARAMETER:
DbgPrint("Invalid parameters.\nFailed to register for process creation notification.\n");
status = STATUS_UNSUCCESSFUL;
break;
case STATUS_ACCESS_DENIED:
DbgPrint("Access denied.\nFailed to register for process creation notification.\n");
status = STATUS_UNSUCCESSFUL;
break;
}
DbgPrint("Driver loaded.\n");
return STATUS_SUCCESS;
}