2016-07-21 3 views
-1

Я создаю довольно простую базу данных инвентаря, которая позволит мне проверять элементы между датами. Мне нужно будет вернуть одну строку, которая сообщит мне доступную, зарезервированную и полную инвентаризацию этого элемента. Кажется, я не понимаю этого.SQL Server Количество доступных позиций

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 

EDIT: Я только возвращение строки из 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

+0

В чем проблема, помимо использования 'WHERE' в' COUNT'? Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+0

У меня есть вопрос, связанный с изменением – JamTay317

+0

Этого еще недостаточно. Нам нужна схема db, выборочные данные и ожидаемый результат. Прочтите ссылку, которую я предоставляю, чтобы вы получили советы о том, как улучшить свой вопрос. –

ответ

1
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] 
2

Вот синтаксически правильный вариант:

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; 

Там нет транзакции, когда вы делаете выбор, поэтому совершение не требуется.

0

С помощью Хуана Карлоса я нашел правильный ответ.

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 
Смежные вопросы