繁体   English   中英

SQL Server计数项可用

[英]SQL Server Count items available

我正在建立一个非常简单的库存项目数据库,该数据库将使我能够检查日期之间的项目。 我将需要返回一行来告诉我该商品的可用,保留和总库存。 我似乎无法正确理解。

BEGIN TRAN
DECLARE @startDate AS DATE
DECLARE @endDate AS DATE
DECLARE @partID AS INT
SET @startDate = '4/15/2015'
SET @endDate = '4/25/2015'
SET @partID = 248

SELECT COUNT(ii.[PartId] WHERE ii.[PartStatus] = 1 ) AS [Available],
       COUNT(ii.[PartId] WHERE ii.[PartStatus] = 2 ) AS [Reserverd],
       COUNT(ii.[PartId] WHERE ii.[PartStatus] <> 4 ) AS [TotalInventory],
FROM ShipListInventory.dbo.InventoryItems AS ii
LEFT JOIN ShipListInventory.dbo.InventoryItemCalendars AS iic   
     ON iic.[ItemId] = ii.[Id]
WHERE iic.[StartDate] NOT BETWEEN @startDate AND @endDate
  AND iic.[InboundDate] NOT BETWEEN @startDate AND @endDate
  AND ii.[PartId] = 248
COMMIT TRAN

编辑:我只从InventoryItemCalendars返回行,我想从InventoryItems返回项

CREATE TABLE [dbo].[InventoryItems](
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [PartSatuts] [INT] NOT NULL,
    [PartId] [INT] NOT NULL,
    [Barcode] [NVARCHAR](MAX) NULL,
    [PicturePath] [NVARCHAR](255) NULL,
    [Notes] [NVARCHAR](1000) NULL,
 CONSTRAINT [PK_dbo.InventoryItems] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[InventoryItems]  WITH CHECK ADD  CONSTRAINT [FK_dbo.InventoryItems_dbo.Parts_PartId] FOREIGN KEY([PartId])
REFERENCES [dbo].[Parts] ([Id])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[InventoryItems] CHECK CONSTRAINT [FK_dbo.InventoryItems_dbo.Parts_PartId]
GO
CREATE TABLE [dbo].[InventoryItemCalendars](
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [StartDate] [DATETIME] NOT NULL,
    [InboundDate] [DATETIME] NOT NULL,
    [ProjectNumber] [INT] NOT NULL,
    [ItemId] [INT] NOT NULL,
    [Project_Id] [INT] NULL,
 CONSTRAINT [PK_dbo.InventoryItemCalendars] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[InventoryItemCalendars]  WITH CHECK ADD  CONSTRAINT [FK_dbo.InventoryItemCalendars_dbo.InventoryItems_ItemId] FOREIGN KEY([ItemId])
REFERENCES [dbo].[InventoryItems] ([Id])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[InventoryItemCalendars] CHECK CONSTRAINT [FK_dbo.InventoryItemCalendars_dbo.InventoryItems_ItemId]
GO

ALTER TABLE [dbo].[InventoryItemCalendars]  WITH CHECK ADD  CONSTRAINT [FK_dbo.InventoryItemCalendars_dbo.Projects_Project_Id] FOREIGN KEY([Project_Id])
REFERENCES [dbo].[Projects] ([Id])
GO

ALTER TABLE [dbo].[InventoryItemCalendars] CHECK CONSTRAINT [FK_dbo.InventoryItemCalendars_dbo.Projects_Project_Id]
GO

INSERT INTO ShipListInventory.[dbo].[InventoryItems]([PartSatuts],[PartId]) VALUES(1,1);
INSERT INTO ShipListInventory.[dbo].[InventoryItems]([PartSatuts],[PartId]) VALUES(2,1);
INSERT INTO ShipListInventory.[dbo].[InventoryItems]([PartSatuts],[PartId]) VALUES(1,1);
INSERT INTO ShipListInventory.[dbo].[InventoryItems]([PartSatuts],[PartId]) VALUES(4,1);


INSERT INTO ShipListInventory.[dbo].[InventoryItemCalendars](StartDate,InboundDate,Project_Id, ItemId)VALUES('1/1/2015', '4/15/2015',1,1)
INSERT INTO ShipListInventory.[dbo].[InventoryItemCalendars](StartDate,InboundDate,Project_Id, ItemId)VALUES('1/1/2015', '4/15/2015',1,1)
INSERT INTO ShipListInventory.[dbo].[InventoryItemCalendars](StartDate,InboundDate,Project_Id, ItemId)VALUES('1/1/2015', '4/14/2015',1,2)
INSERT INTO ShipListInventory.[dbo].[InventoryItemCalendars](StartDate,InboundDate,Project_Id, ItemId)VALUES('1/1/2015', '4/15/2015',1,1)

这不是从正确的表返回数据,它只是返回InventoryItemCalendars数据形式,这不是我想要的。 我希望它仅使用它来检查日期。 它应该从InventoryItems表返回项目

这是语法正确的版本:

SELECT SUM(CASE WHEN ii.[PartStatus] = 1 THEN 1 ELSE 0 END) AS [Available],
       SUM(CASE WHEN ii.[PartStatus] = 2  THEN 1 ELSE 0 END) AS [Reserverd],
       SUM(CASE WHEN ii.[PartStatus] <> 4  THEN 1 ELSE 0 END) AS [TotalInventory]
FROM ShipListInventory.dbo.InventoryItems ii LEFT JOIN  
     ShipListInventory.dbo.InventoryItemCalendars AS iic   
     ON iic.[ItemId] = ii.[Id]
WHERE iic.[StartDate] NOT BETWEEN @startDate AND @endDate AND
      iic.[InboundDate] NOT BETWEEN @startDate AND @endDate AND
      ii.[PartId] = 248;

执行选择时没有事务,因此不需要提交。

SELECT COUNT(CASE WHEN ii.[PartStatus] =  1 THEN ii.[PartId] END) AS [Available],
       COUNT(CASE WHEN ii.[PartStatus] =  2 THEN ii.[PartId] END) AS [Reserverd],
       COUNT(CASE WHEN ii.[PartStatus] <> 4 THEN ii.[PartId] END) AS [TotalInventory]

在胡安·卡洛斯的帮助下,我找到了正确的答案。

SELECT COUNT(CASE WHEN  ii.[PartSatuts]=1 THEN ii.[PartId] END ) AS [Available],
       COUNT(CASE WHEN  ii.[PartSatuts]=2 THEN ii.[PartId] END ) AS [Reserverd],
       COUNT(CASE WHEN  ii.[PartSatuts]<> 4 THEN ii.[PartId] END ) AS [TotalInventory]
FROM ShipListInventory.dbo.InventoryItems AS ii
LEFT JOIN ShipListInventory.dbo.InventoryItemCalendars AS iic   
     ON iic.ItemId = ii.Id
WHERE ((iic.StartDate NOT BETWEEN @startDate AND @endDate
  AND iic.InboundDate NOT BETWEEN @startDate AND @endDate)
  OR iic.InboundDate IS NULL)
  AND ii.PartId = 248

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM