[ad_1]
Saya memiliki Crystal Report yang saat ini saya konversi ke SSRS. Laporan ini memiliki 3 kolom untuk MTD (nilai Bulan hingga Tanggal) dan 3 kolom untuk YTD (nilai Tahun hingga Tanggal). Saya dapat memisahkan 3 kolom tersebut tetapi untuk keakuratan data saya perlu menggabungkannya dalam satu pernyataan SQL untuk menghasilkan output dalam satu baris. Saya bisa mendekatinya menggunakan beberapa fungsi penggabungan di SQL. Masalahnya adalah saya tidak dapat menggunakan perintah grup demi dan membuat saya melakukan kesalahan. Apa yang harus saya edit dalam kueri SQL saya seperti yang ditunjukkan pada Crystal Report di bawah ini?
Kesalahan:
Msg 512, Level 16, State 1, Line 106 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Crystal Report saat ini yang saya ubah menjadi SSRS
EDIT : Saya baru saja membuat sampel dbfiddle : DB Fiddle – Taman Bermain Basis Data SQL[^]
Dalam Kode 2 saya telah mencoba menggunakan some with dan unions tetapi itu memberi saya beberapa kesalahan
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Apa yang saya coba:
Kode 1
SET ARITHABORT OFF SET ANSI_WARNINGS OFF SELECT coalesce((Select ((SUM( "IS_vwSalesbyProductLineComp"."sls_amt")-SUM( "IS_vwSalesbyProductLineComp"."cost_amt"))/SUM( "IS_vwSalesbyProductLineComp"."sls_amt"))*100 ),0) AS G1MTD, "IS_vwSalesbyProductLineComp"."Mainslspsn_name", "IS_vwSalesbyProductLineComp"."PCSummarized", coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."qty_to_ship"-"IS_vwSalesbyProductLineComp"."qty_return_to_stk")FROM "100"."dbo"."IS_vwSalesbyProductLineComp" where Year = 2021 and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS Qty_Sold, coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."sls_amt")FROM "100"."dbo"."IS_vwSalesbyProductLineComp" where Year = 2021 and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS YTD_Sales, coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."cost_amt")FROM "100"."dbo"."IS_vwSalesbyProductLineComp" where Year = 2021 and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS YTD_COGS, coalesce((Select ((SUM( "IS_vwSalesbyProductLineComp"."sls_amt")-SUM( "IS_vwSalesbyProductLineComp"."cost_amt"))/SUM( "IS_vwSalesbyProductLineComp"."sls_amt"))*100 FROM "100"."dbo"."IS_vwSalesbyProductLineComp" where Year = 2021 and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS G2YTD, SUM("IS_vwSalesbyProductLineComp"."qty_to_ship"-"IS_vwSalesbyProductLineComp"."qty_return_to_stk") AS Qty_Sold, SUM("IS_vwSalesbyProductLineComp"."sls_amt") AS MTD_Sales, SUM("IS_vwSalesbyProductLineComp"."cost_amt") AS MTD_COGS FROM "100"."dbo"."IS_vwSalesbyProductLineComp" where Year = 2021 and Month = 12 Group by Mainslspsn_name,PCSummarized order by PCSummarized
Kode 2
SET ARITHABORT OFF SET ANSI_WARNINGS OFF WITH T1 AS ( SELECT ( SELECT((SUM(IS_vwSalesbyProductLineComp.sls_amt) - SUM(IS_vwSalesbyProductLineComp.cost_amt)) / SUM(IS_vwSalesbyProductLineComp.sls_amt)) * 100) AS G1MTD, IS_vwSalesbyProductLineComp.Mainslspsn_name, IS_vwSalesbyProductLineComp.PCSummarized, ( SELECT SUM(IS_vwSalesbyProductLineComp.qty_to_ship - IS_vwSalesbyProductLineComp.qty_return_to_stk) FROM "100".dbo.IS_vwSalesbyProductLineComp WHERE Year = 2021 AND Month BETWEEN 1 AND 12 GROUP BY Mainslspsn_name, PCSummarized) AS Qty_Sold, ( SELECT SUM(IS_vwSalesbyProductLineComp.sls_amt) FROM "100".dbo.IS_vwSalesbyProductLineComp WHERE Year = 2021 AND Month BETWEEN 1 AND 12 GROUP BY Mainslspsn_name, PCSummarized) AS YTD_Sales, ( SELECT SUM(IS_vwSalesbyProductLineComp.cost_amt) FROM "100".dbo.IS_vwSalesbyProductLineComp WHERE Year = 2021 AND Month BETWEEN 1 AND 12 GROUP BY Mainslspsn_name, PCSummarized) AS YTD_COGS, ( SELECT((SUM(IS_vwSalesbyProductLineComp.sls_amt) - SUM(IS_vwSalesbyProductLineComp.cost_amt)) / SUM(IS_vwSalesbyProductLineComp.sls_amt)) * 100 FROM "100".dbo.IS_vwSalesbyProductLineComp WHERE Year = 2021 AND Month BETWEEN 1 AND 12 GROUP BY Mainslspsn_name, PCSummarized) AS G2YTD, SUM(IS_vwSalesbyProductLineComp.qty_to_ship - IS_vwSalesbyProductLineComp.qty_return_to_stk) AS Qty_Sold2, --> renamed because ambigous SUM(IS_vwSalesbyProductLineComp.sls_amt) AS MTD_Sales, SUM(IS_vwSalesbyProductLineComp.cost_amt) AS MTD_COGS FROM "100".dbo.IS_vwSalesbyProductLineComp WHERE Year = 2021 AND Month = 12 GROUP BY Mainslspsn_name, PCSummarized ), T2 AS ( SELECT 0 AS C1, '' AS C2, '' AS C3, 0 AS C4, 0 AS C5, 0 AS C6, 0 AS C7, 0 AS C8, 0 AS C9, 0 AS C10 ), T3 AS ( SELECT * FROM T1 UNION SELECT * FROM T2 ) SELECT SUM(G1MTD) AS G1MTD, (SELECT [text()] = Mainslspsn_name FROM "100".dbo.IS_vwSalesbyProductLineComp FOR XML PATH(''), TYPE ).value ( './text()[1]', 'nvarchar(max)' ), (SELECT [text()] = PCSummarized FROM "100".dbo.IS_vwSalesbyProductLineComp FOR XML PATH(''), TYPE ).value ( './text()[1]', 'nvarchar(max)' ), SUM(Qty_Sold) AS Qty_Sold, SUM(YTD_Sales) AS YTD_Sales, SUM(YTD_COGS) AS YTD_COGS, SUM(G2YTD) AS G2YTD, SUM(Qty_Sold2) AS Qty_Sold2, SUM(MTD_Sales) AS MTD_Sales, SUM(MTD_COGS) AS MTD_COGS FROM T3 GROUP BY Mainslspsn_name, PCSummarized ORDER BY PCSummarized;
Solusi 1
Jika tidak ada data sampel, mulailah dengan mengatasi poin-poin berikut.
— 100.dbo.IS_vwSalesbyProductLineComp bukan pengidentifikasi SQL yang valid. Pengidentifikasi SQL harus dimulai dengan huruf atau garis bawah
— Anda tidak perlu mengkualifikasi nama tabel di kolom jika hanya memilih dari satu tabel
— jika Anda ingin memenuhi syarat kolom maka gunakan alias alih-alih nama tabel lengkap untuk membuat skrip lebih mudah dibaca, misalnya daripada
select IS_vwSalesbyProductLineComp.sls_amt from IS_vwSalesbyProductLineComp
menggunakan
select splc.sls_amt from IS_vwSalesbyProductLineComp splc
— hilangkan pembatas pada nama kolom dan tabel – hal tersebut tidak diperlukan dan hanya membuat kueri Anda tidak dapat dibaca
— Jika Anda menggunakan pembatas maka gunakanlah [ ] yaitu sebagai gantinya "IS_vwSalesbyProductLineComp"
menggunakan [IS_vwSalesbyProductLineComp]
– sekali lagi, ini lebih mudah dibaca
— pernyataanmu
Mengutip:tetapi untuk keakuratan data saya perlu menggabungkannya dalam satu pernyataan SQL
tidak valid. Jumlah pernyataan SQL yang digunakan tidak berpengaruh apa pun terhadap keakuratan data. Terobsesi untuk memasukkan semuanya ke dalam satu pernyataan dapat merusak kejelasan, keakuratan (skrip Anda, bukan data) dan kinerja.
— sama sekali tidak diperlukan semua subkueri tersebut – ditambah lagi, seperti yang Anda lihat, Anda mendapatkan beberapa baris kembali
Dapatkan semua data yang Anda perlukan dalam baris terpisah – jika Anda bersikeras menjadikannya satu pernyataan SQL maka gunakan Common Table Expression (CTE – DENGAN common_table_expression (Transact-SQL) – SQL Server | Microsoft Dokumen[^] ).
Kemudian POROS hasil tersebut untuk mendapatkan tabel yang Anda inginkan – lihat Operator PIVOT SQL Server Dijelaskan Dengan Jelas Dengan Contoh Praktis[^]
Solusi 2
Sekilas… pertanyaan Anda sangat buruk:
Kesalahan yang paling penting adalah: terlalu banyak SELECT!
Anda punya 1 utama SELECT
dan kemudian 4 sub-SELECT
!
Cobalah untuk menulis ulang kueri Anda agar dapat menggunakan lebih sedikit SELECT
.
Periksa setiap subkueri. Jika salah satu darinya mengembalikan lebih dari satu catatan, Anda harus meningkatkan kueri itu.
Sementara itu, silakan baca ini: Perbaiki Pesan 512 “Subquery mengembalikan lebih dari 1 nilai” di SQL Server[^]
Solusi 5
https://www.google.com/search?q=standale+to+Hometown+Water+Fire+Restoration
Namun postingan yang bagus, saya ingin tahu apakah Anda dapat menulis lebih banyak tentang subjek ini?
Saya akan sangat berterima kasih jika Anda dapat menjelaskan lebih lanjut.
Bersulang!
[ad_2]
コメント