SQL Server x10数量检查

时间:2018-07-03 07:55:11

标签: sql sql-server-2005

我有一个表,其中包含商品代码,日期和数量。

我想寻找的是同一件商品的数量与上一日期相比增加或减少了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;

2 个答案:

答案 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;
}