私は、データベース内の出荷エントリのグループについてレポート (月次、年初来など) を作成して、正しい金額を表示し、運送会社ごとにグループ化しようとしています。このすべての情報を取得して適切なレポートを作成するにはどうすればよいですか?
注意すべきことの 1 つは、さまざまなソースから奇妙な文字を含むテキストをインポートするため、このテーブルのすべてのエントリが nvarchar(max) であるということです。
master データベースのリストは次のようになります。
テーブル - shipping_info
shipping_company | ship_date | shipping_category | shipping_cost
UPS | 20130301 | CD'S | 3.50
UPS | 20130310 | Records | 4.50
UPS | 20130322 | CD'S | 7.50
UPS | 20130313 | Tapes | 12.44
UPS | 20130324 | CD'S | 3.50
UPS | 20120312 | Records | 4.50
UPS | 20120304 | CD'S | 5.50
UPS | 20120306 | Tapes | 3.50
UPS | 20130309 | CD'S | 3.50
USPS | 20130301 | Tapes | 3.50
USPS | 20130301 | CD'S | 5.50
USPS | 20130301 | CD'S | 4.50
USPS | 20130201 | Tapes | 3.50
USPS | 20130201 | CD'S | 3.50
USPS | 20130201 | Records | 7.50
USPS | 20130201 | Tapes | 9.50
USPS | 20130201 | CD'S | 12.50
USPS | 20120301 | CD'S | 14.50
USPS | 20120301 | Records | 3.50
USPS | 20130301 | CD'S | 23.50
USPS | 20120301 | Tapes | 15.50
USPS | 20120301 | CD'S | 34.50
DHL | 20120301 | Tapes | 35.50
DHL | 20120301 | CD'S | 3.50
DHL | 20130301 | Tapes | 3.50
DHL | 20130401 | CD'S | 3.50
DHL | 20130401 | Records | 4.50
DHL | 20130501 | CD'S | 4.50
DHL | 20120201 | Tapes | 5.50
DHL | 20120101 | CD'S | 6.50
DHL | 20120501 | CD'S | 3.50
DHL | 20120301 | Tapes | 7.50
私の目標は、1 か月あたりの合計送料の shipping_company によってフィルター処理されたリストを出力する最終的なリストを取得することです。将来的には、これまでの年などのリストを取得したいと考えています。とにかく、私が月次レポートで見たいのは次のようなものです。
UPS Shipping Cost Report for March 2013
CD's - $23.50
Records - $9.00
Tapes - $15.94
私が試したことは最初です
SELECT shipping_company, ship_date, shipping_category, shipping_cost FROM shipping_info WHERE (shipping_company = 'UPS' and shipping_cost IS NOT NULL and shipping_cost != '') GROUP BY shipping_company, ship_date, shipping_category, shipping_cost ORDER BY shipping_company, ship_date, shipping_category, shipping_cost
これにより、フィルタリングされた優れたテーブルが作成されましたが、合計を計算し、合計をカテゴリ別にグループ化する必要がありました。
私はそれからこれを試しました....
SELECT shipping_company, ship_date, shipping_category, SUM(shipping_cost) FROM shipping_info WHERE (shipping_company = 'UPS' and shipping_cost IS NOT NULL and shipping_cost != '') GROUP BY shipping_company, ship_date, shipping_category, shipping_cost ORDER BY shipping_company, ship_date, shipping_category, shipping_cost
これは NVARCHAR(MAX) テーブルであるため、t-sql は、shipping_cost を int に変換する必要があることを示すエラーで失敗しました。
ということで・・・次にやってみました。
SELECT shipping_company, ship_date, shipping_category, convert(decimal(10, 2), shipping_cost) FROM shipping_info WHERE (shipping_company = 'UPS' and shipping_cost IS NOT NULL and shipping_cost != '') GROUP BY shipping_company, ship_date, shipping_category, shipping_cost ORDER BY shipping_company, ship_date, shipping_category, shipping_cost
どの種類が機能し、どの種類が機能しなかったか。
このリストをレポート可能なセグメントに分割する場合、最初の例からどの方向に進むべきか、今のところ私は困惑しています。自分の情報を、必要な月次レポートの形式にするための正しい道を進んでいますか?
::編集/更新::
これは素晴らしいことであり、機能しています。このコードの個々のステップに時間を費やし、ここで何が起こっているかの背後にある理論を理解しました。ここで私が苦労している最後のことが1つあります。このテーブルは NVARCHAR(MAX) であるため、ship_date を数値に変換しようとして成功しませんでした。
以下の元のコードを使用しました-例1:
select
CASE WHEN (GROUPING(shipping_company) = 1) THEN 'TOTAL'
ELSE shipping_company END AS shipping_company,
CASE WHEN (GROUPING(SUBSTRING(ship_date, 1, 6)) = 1) THEN 'TOTAL'
ELSE SUBSTRING(ship_date, 1, 6) END AS Date,
CASE WHEN (GROUPING(shipping_category) = 1) THEN 'Yearly TOTAL'
ELSE shipping_category END AS shipping_category,
sum(convert(decimal(10,2),shipping_cost))
from tbl
group by shipping_company, SUBSTRING(ship_date, 1, 6),
shipping_category WITH rollup
次に、以下に示すように数値変換コマンドを追加しました - 例 2:
select
CASE WHEN (GROUPING(shipping_company) = 1) THEN 'TOTAL'
ELSE shipping_company END AS shipping_company,
CASE WHEN (GROUPING(CONVERT(numeric, (SUBSTRING(ship_date, 1, 6))) = 1) THEN 'TOTAL'
ELSE (CONVERT(numeric, SUBSTRING(ship_date, 1, 6))) END AS Date,
CASE WHEN (GROUPING(shipping_category) = 1) THEN 'Yearly TOTAL'
ELSE shipping_category END AS shipping_category,
sum(convert(decimal(10,2),shipping_cost))
from tbl
group by shipping_company, (CONVERT(numeric, SUBSTRING(ship_date, 1, 6))),
shipping_category WITH rollup
しかし、まだnvarcharを数値エラーに変換しています。次に、次のように移動しました-例3:
select
CASE WHEN (GROUPING(shipping_company) = 1) THEN 'TOTAL'
ELSE shipping_company END AS shipping_company,
CASE WHEN (CONVERT(numeric, GROUPING(SUBSTRING(ship_date, 1, 6))) = 1) THEN 'TOTAL'
ELSE (CONVERT(numeric, SUBSTRING(ship_date, 1, 6))) END AS Date,
CASE WHEN (GROUPING(shipping_category) = 1) THEN 'Yearly TOTAL'
ELSE shipping_category END AS shipping_category,
sum(convert(decimal(10,2),shipping_cost))
from tbl
group by shipping_company, (CONVERT(numeric, SUBSTRING(ship_date, 1, 6))),
shipping_category WITH rollup
そして、「グループ化関数の引数 1 は、GROUP BY 句のどの式とも一致しません」という意味があります。2番目の例が機能しない理由だけでなく、変換を機能させるための正しい行動方針は何かという背後にある理論を本当に学びたいです.