1

これにタイトルを付ける方法がよくわかりませんが、できる限りのことをしました。選択した場所のすべてのアセットを表示するレポートがあります。私たちの問題の 1 つは、すべてを資産として追跡していることです。したがって、典型的なコンピュータ システムには、5 台のコンピュータと 8 台のモニタがありますが、ネットワーク ケーブルは 10 本以上あります。不要なアイテムを「ロールアップ」して、実際のアイテムの代わりにカウントを表示するレポートを作成しようとしています。

たとえば、私はこれが欲しい:

Desc            | Manufacturer  | Serial Number
-----+-------    ----+--------------------
20" monitor     | Dell          | 123456
25" monitor     | Dell          | 123456ab
6ft Net. Cable  | N/A           | NA123
6ft Net. Cable  | N/A           | NA124
6ft Net. Cable  | N/A           | NA125
6ft Net. Cable  | N/A           | NA456
1TB SATA HD     | SeaGate       | SG125000
1.5TB SATA HD   | SeaGate       | SG100000

することが:

Desc            | Manufacturer  | Serial Number/Qnty
-----+-------    ----+-----------------------------
20" monitor     | Dell          | 123456
25" monitor     | Dell          | 123456ab
6ft Net. Cable  | N/A           | 4
1TB SATA HD     | SeaGate       | SG125000
1.5TB SATA HD   | SeaGate       | SG100000

上位の部分を取得する SQL は次のとおりですが、下位の結果を取得するためにどこから始めればよいかわかりません。

SELECT i.ItemDescription AS Desc, s.Name AS Manufacturer, inv.SerialNumber AS [Serial Number]
FROM Assets a 
LEFT OUTER JOIN Inventory inv ON a.InventoryID = inv.InventoryID 
LEFT OUTER JOIN Items i ON inv.ItemID = i.ItemID 
LEFT OUTER JOIN Rooms r ON a.RoomID = r.RoomID 
LEFT OUTER JOIN Locations l ON r.LocationID = l.LocationID 
LEFT OUTER JOIN Suppliers s ON i.ManufacturerID = s.SupplierID 
WHERE l.LocationID = 5

「グループ化された」行を基準に基づいて作成する必要があるため、次のような WHERE 句に含める WHERE l.LocationID = 5 AND inv.SerialNumber LIKE 'NA%'必要があります。 「NA%」などの通し番号のもの

どんな助けでも大歓迎です!

4

2 に答える 2

1

以下を使用できるはずです。

;with cte as
(
  SELECT i.ItemDescription AS Desc, s.Name AS Manufacturer, inv.SerialNumber AS [Serial Number]
  FROM Assets a 
  LEFT OUTER JOIN Inventory inv ON a.InventoryID = inv.InventoryID 
  LEFT OUTER JOIN Items i ON inv.ItemID = i.ItemID 
  LEFT OUTER JOIN Rooms r ON a.RoomID = r.RoomID 
  LEFT OUTER JOIN Locations l ON r.LocationID = l.LocationID 
  LEFT OUTER JOIN Suppliers s ON i.ManufacturerID = s.SupplierID 
  WHERE l.LocationID = 5
),
totals as
(
  select [Desc], count(*) TotalCount
  from cte
  group by [desc]
)
select c.[desc],
  c.Manufacturer,
  case 
    when t.TotalCount > 1 
    then cast(t.TotalCount as varchar(50))
    else [Serial Number]
  end [Serial Number/Qnty]
from cte c
inner join totals t
  on c.[desc] = t.[desc]
于 2013-02-26T20:36:27.693 に答える
0

これを試して

;with cte as

(
    SELECT i.ItemDescription AS Desc, s.Name AS Manufacturer, 
    CASE WHEN isnull(inv.SerialNumber,'') like 'NA%' Then 'NA'
         Else inv.SerialNumber end AS [Serial Number]

     FROM Assets a 
     LEFT OUTER JOIN Inventory inv ON a.InventoryID = inv.InventoryID 
     LEFT OUTER JOIN Items i ON inv.ItemID = i.ItemID 
     LEFT OUTER JOIN Rooms r ON a.RoomID = r.RoomID 
     LEFT OUTER JOIN Locations l ON r.LocationID = l.LocationID 
     LEFT OUTER JOIN Suppliers s ON i.ManufacturerID = s.SupplierID 
     WHERE l.LocationID = 5

), cte2 as
(
     SELECT Desc, Manufacturer, [Serial Number], Count(*) cnt
     FROM cte2
     GROUP BY Desc, Manufacturer, [Serial Number]
)
SELECT Desc, Manufacturer, CASE WHEN isnull([Serial Number],'') = 'NA' 
                                THEN CAST(cnt as varchar)
                                else [Serial Number] end [Serial Number]
from cte2;
于 2013-02-26T20:26:13.097 に答える